新しい Wercker step を使う

              · ·

2年ほど前から Wercker を個人的に使っています。 Travis CICircleCI と並ぶ 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 で入る curl7.22.0, openssl1.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.04OpenSSL 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.ymlstep.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 を公開しているので、参考になれば幸いです。