新しい Wercker step を使う
devops GCP · Terraform · Wercker
2年ほど前から Wercker を個人的に使っています。 Travis CI や CircleCI と並ぶ CI/CD ツールのひとつです。
Wercker には step という概念があり、よく使う処理を1つの step に纏めて使い回せるという便利な機能です。 1年以上前に、 Wercker から terraform を簡単に実行するために作った step https://github.com/ww24/wercker-step-terraform のメンテを放置してしまい、 terraform の version が未だに 0.8 です。
このままではまずいと思い対応を始めたのですが… 紆余曲折あったのでブログのネタにしようと思います。 結果的に、新しい Wercker step の作り方を知ることが出来ました。
事の発端
軽い気持ちで terraform の version を上げていこうと着手した所、まず Wercker の box wercker/default
が Ubuntu 12.04 のままメンテされなくなり、ある時遂に releases.hashicorp.com
に接続できなくなりました。
※ Ubuntu 12.04 は 2017年4月にサポートが切れています。
Ubuntu 12.04 で入る curl
は 7.22.0
, openssl
は 1.0.1
です。
Wercker 上で次のエラーが出ます。
$ curl -vLO "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
* About to connect() to releases.hashicorp.com port 443 (#0)
* Trying 151.101.201.183... % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0connected
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS alert, Server hello (2):
{ [data not shown]
* error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
* Closing connection #0
curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
OpenSSL のエラーです。 openssl
コマンドでも確認することが出来ます。
$ openssl s_client -connect releases.hashicorp.com:443 < /dev/null
CONNECTED(00000003)
139884534150816:error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version:s23_clnt.c:724:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 226 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
手元の Docker の ubuntu:12.04
の image では繋がるのが謎なので調べてみたら、 wercker/default
では何故か TLS 1.2 が使える OpenSSL が入っているにも関わらず TLS 1.0 が標準になっているため TLS 1.2 未満では繋げない設定になっているサーバーとのネゴシエーションに失敗します。
次のように TLS 1.2 を明示すると繋がります。
$ openssl s_client -connect releases.hashicorp.com:443 -tls1_2 < /dev/null
CONNECTED(00000003)
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign CloudSSL CA - SHA256 - G3
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=San Francisco/O=Fastly, Inc/CN=s.ssl.fastly.net
i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign CloudSSL CA - SHA256 - G3
1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign CloudSSL CA - SHA256 - G3
i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
<以下略>
しかし、 curl 7.22.0
では接続時の TLS のバージョン指定が 1.0 までしか対応していない為、詰んでいます。
そもそも Ubuntu 12.04
と OpenSSL 1.0.1
は既にサポートされていないので使うべきではありません。
仕方ないので wercker/default
を使うことを諦めました。
Wercker new steps
Wercker では結構前から box に Docker Hub などの repository にある image を指定できるようになったので step にも使えるだろうと試した所、何故か存在しないとエラーが出てしまいます。
公式で提供されている step の wercker.yml
を見に行くと、いつの間にか Docker Hub 上の image を参照していました。
https://github.com/wercker/step-shellcheck/blob/master/wercker.yml
また、ドキュメントには記載されていない internal/publish-step
という step が使われていて、更には wercker-step.yml
が step.yml
という名前に変わっていて… どうやら step の書き方や deploy 方法が刷新されているようです。
調べても情報が少なすぎるので、 Wercker に拙い英語で問い合わせてみることにしました。
I want to use Docker Hub hosted container.
But, I can't use it now. :_(
I found Docker Hub hosted container used in https://github.com/wercker/step-shellcheck. What is `step.yml` and `internal/publish-step`. I couldn't find these in docs. Please tell me how I use these.
My step is here.
https://app.wercker.com/ww24/wercker-step-terraform/runs
すると、すぐに返信が帰ってきて PR が作られました。
https://github.com/ww24/wercker-step-terraform/pull/19
そもそも、新しい step は Wercker 上で Application と同じ扱いになるようです。
重要なのは、現状 Marketplace で公開されないことでしょうか。 API を叩けば確認することが出来て、普通に step として使えるようです。
こうして、なんとか https://github.com/ww24/wercker-step-terraform は新しい wercker step として生まれ変わり box として debian:stable-slim
を参照できるようになって新しい terraform に更新する環境が整いました。
さいごに
今後、現在最新版の 0.11 まで更新するので Wercker で terraform を使った deploy を行う際は https://github.com/ww24/wercker-step-terraform を使ってみてください。
因みに ww24/terraform
を使って Google Cloud CDN を管理するコード https://github.com/ww24/dns を公開しているので、参考になれば幸いです。