ACMで取得した証明書をterraformで配置する
About
Amazon Certificate ManagerでSSL証明書が取得できるので、Terraformと組み合わせてみます。
環境
- Terraform v0.7.10
ACMとは
Amazon Certificate Managerの略で証明書の管理、デプロイなどができるサービスです。証明書自体も無料で、AWS上のリソースで使いまわせるので非常に便利な仕組みです。
AWS Certificate Manager(簡単に SSL/TLS 証明書を作成、管理、配置) | AWS
ACMで証明書を取得する
ACMの画面操作は簡単です。
ここでドメイン名を入力します。ワイルドカード証明書の取得も可能です。
この画面でConfirm and requestをクリックする次のステップとしてドメインの認証をする必要があります。ACMは認証時に入力されたドメインを使って下記のアドレスにメールを送信します。例えば、tjinjin.netだと
- admin@tjinjin.net
- administrator@tjinjin.net
- hostmaster@tjinjin.net
- postmaster@tjinjin.net
- webmaster@tjinjin.net
に認証メールが飛びます。また、その他にもそのドメインの登録者、管理者、技術担当者の情報を取得して送信します。従って、どれかしらのメアドでメールを受け取れるようにしておく必要があります。TLDによっては管理者などの情報をwhoisで取得できないケースがあるようで、その場合は何らかの手段で固定で送信される5つのアドレスを受け取れるようにする対応が必要です。(ioはダメという噂は聞きました。あとは代理公開とかしている場合だと、メールが受け取れないこともありそうです)
うまく認証ができるとこのようになります。
TerraformでELBに証明書を設定する
ACMの取得ができたので次にELBに設定します。こちらは本当に簡単でdata
resourceを使って使いたい証明書のarnを取り出し、それをELBに埋め込むだけです。
data "aws_acm_certificate" "main" { + domain = "XXXX.net" +}
datasource内では実際にAWSに情報を問い合わせて、その情報を取得してから実際の処理をしているようです。(PRチャンスがあれば狙っていきたいところですね)
# Create a new load balancer resource "aws_elb" "bar" { name = "foobar-terraform-elb" availability_zones = ["ap-northeast-1a", "ap-northeast-1c"] access_logs { bucket = "foo" bucket_prefix = "bar" interval = 60 } listener { instance_port = 8000 instance_protocol = "http" lb_port = 80 lb_protocol = "http" } listener { instance_port = 8000 instance_protocol = "http" lb_port = 443 lb_protocol = "https" ssl_certificate_id = "${data.acm_certificate.main.arn}" } ...
こんな感じでdata.
から始まるリソース?をしていすればよいだけです!既存の証明書からの切替もしましたがとくにダウンタイムのなかったのでおすすめです!dataめっちゃいい!
注意
ACMで取得した証明書は自動更新されます。
まとめ
TokyoリージョンだとACMはELBしか対応していないので、Cloudfrontでも証明書を使いたいというケースではもうひと工夫必要そうです。SSL証明書の切替は結構面倒な作業だったので(主に取得する部分が)、それが楽になるのはステキですね!