とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
各種SNSのフォローもよろしくお願いいたします。

AWSとTerraform CloudをOIDCで接続

1月30日にTerraform CloudでDynamic Provider Credentialsがパブリックベータで公開されました。

www.hashicorp.com

Dynamic Provider Credentialsって何かと思ったら、Terraform CloudでOpenID Connect(OIDC)を使うための機能の名前みたいですね。要するにOIDCがつかえるようになった、と。

Terraform Cloudで不満だったのがOIDCを使えなかった点だったのでこれは期待できそうです。さっそく試していきます。

ひつようなもの

  • Terraform v1.2以上
  • Terraform CloudのアカウントとOrg
  • AWSアカウント
    • Terraformを実行するためのIAMユーザーのaccess_keysecret_key
  • GitHubアカウント

下ごしらえ

今回は以下のチュートリアルを参考にAWSと接続していきます。

developer.hashicorp.com

まず、TerraformがOIDCでAWSのリソースを操作できるように、AWSにOIDCプロバイダー、ロールを作成する必要があります。

以下のリポジトリにはこれらのリソースを作成するためのTerraformのコードが入っているので自分のGitHubアカウントにForkしておいてください。

github.com

クローンして、ワーキングディレクトリに移動しておきます。

git clone https://github.com/YOUR_USERNAME/learn-terraform-dynamic-credentials.git
cd learn-terraform-dynamic-credentials
cd aws/trust

tfvarsファイルがexample拡張子をつけて無効化されているのでコピーしてリネームしておきます。

cp terraform.tfvars.example terraform.tfvars

このtfvarsファイルにはTerraform CloudのOrg名とワークスペース名を設定します。この2つは必須です。

tfc_organization_name = "<YOUR_ORG>"
tfc_workspace_name    = "learn-terraform-dynamic-credentials"

その他の設定はvariables.tfをご覧ください。以下の点は注意が必要かもしれません。

  • Terraform Cloudのprojectを変更したい場合はtfc_project_name = "<YOUR_PROJECT>"の行も追加してください。デフォルトではDefault Projectが設定されています。
  • AWSに作成するリソースのリージョンを変更したい場合はaws_region = "<AWS_REGION>"の行も追加してください。デフォルトではus-east-2にリソースが作られます。

以下を参考にTerraformでAWSのリソースを操作できるようにしておいてください。

registry.terraform.io

私はexport AWS_ACCESS_KEY_ID= export AWS_SECRET_ACCESS_KEY=をしました。

Terraformを初期化します。

terraform init

念の為、どのようなリソースが作成されるかplanで確認しておきましょう。

terraform plan

問題がなければリソースを作成します。

terraform apply

applyが完了すると以下のようにrole_arnが出力されます。

このrole_arnをTerraformに知らせることによって、AWSでリソースの追加、削除が行えるようになります。次の作業で使用するのでコピーしておいてください。

OIDCを使ってAWSリソースの操作

いよいよOIDCを使用してAWSにEC2を起動します。

Terraform CloudのOrgに移動して、Version control workflowでワークスペースを作成します。ワークスペース名はterraform.tfvarsのtfc_workspace_nameと一致させてください。

ワークスペースが作成できたら環境変数を入力します。

Variable category Key Value Sensitive
Environment variable TFC_AWS_PROVIDER_AUTH true No
Environment variable TFC_AWS_RUN_ROLE_ARN role_arnの値 No

こんな感じで設定できていればOKです。

次はSettings > Version Controlに移動してTerraform Workking Directoryaws/infraを設定します。

Start a new runを実行してAWSにEC2を起動してみましょう。

このインスタンスはhttpdが起動してHello, world!を返すんですが、セキュリティグループで弾かれるかもしれません。もし、outputsのdomain_nameでブラウザからアクセスできない場合は、AWSコンソールからセキュリティグループを調整してみてください。terraform.tfvarsでaws_regionを設定していなかったらオハイオで起動していると思います。

見れました。

片付けをして終わります。

Settings > Destruction and Deletion に移動して、Queue destroy planを実行してください。これでAWSに作ったリソースを削除できます。

ワークスペースも削除する場合は、Settings > Destruction and Deletion に移動して、Delete from Terraform Cloudを実行してください。

OIDCも削除する場合は、クローンしたサンプルプロジェクトのaws/trustに移動して、terraform destroyを実行してください。

まとめ

Terraform Cloud、OIDCで接続できれば最高なんだけどなぁっと思ってたところに追加されたこの機能、控えめに言って最高でした。ずっと待ってた機能です。今後ますますTerraform Cloudから離れられなくなりそうです。