limitusus’s diary

主に技術のことを書きます

terraformのprovider aliasを使うときのtips

最近よくterraformで構成管理とか構築をやってて、ハマったのでメモ。

やろうとしたこと

AWS ap-northeast-1で主な構成を組んでいて、CloudFrontでの静的コンテンツ配信をhttpsで行いたい。このときACMを利用するが、証明書はus-east-1に配置する必要がある。

証明書の発行はWeb画面でやったので、terraformにはdata aws_acm_certificateとして利用することにした。

このときリソースの場所は普段ap-northeast-1のため、明示的にus-east-1を指定してやらないと意図した証明書が得られない(あたりまえ)。

このためには以下のサイトのように、provider aliasを使ってregionを指定し、data resourceでproviderを指定する。

coderwall.com

これで全てはうまくいく、はずだった。

やってみた

実際にやってみたところ、data resourceで得られる証明書がus-east-1のものにならない。

ディレクトリ構成とファイルの中身はおおよそ以下のようにしていた

うまくいかない設定

gist.github.com

terraformでは .tf ファイルをアルファベット順に読み込み、overrideで始まるファイルはその後で読み込んで上書く。普段からprofileを指定するようにしているので、このようなoverride.tfを使っている。

この状態でterraform outputを見てみると、なぜかap-northeast-1の証明書が出てきた。もちろんこのあとCloudFrontに設定しようとするとregionがus-east-1ではないので設定できずエラーとなる。

悩んだ挙句、ファイル分割とproviderのoverrideの相性が悪いようだということがわかった。

解消方法

  • override.tfを外す。とりあえずこれで問題は起きなくなる。でもこれでは困る。
  • provider aliasをaliasなしのproviderより後ろで読まれるようにする。単純に後ろに書くようにしてもいいし、ファイル名のアルファベット順で後から読まれるようなファイルに書くのでも構わない。overrideはいずれにしても後から読まれるので、気にしなくてよい。

コードをきちんと確認したわけではないが、providerをoverrideしてしまっているため、aliasが正しく機能しなくなっているものと思われる。

結局今回はprovider aliasをmain.tfより後ろで読まれるよう、main_global.tfなるファイルに記述することで解消した。

うまくいく設定

gist.github.com

以上、備忘録。