この記事はAWS前提のものです
TFC Dynamic Credentialsとは
- Terraform Cloud(以下TFC)に実装されたCredentialを動的に発行する仕組み
- Terraformで何かしらデプロイする際はデプロイ先にアクセスできるCredentialが必要となる
- AWSなどであれば、専用のIAMでAPIキー周りを発行して利用するような形がシンプル
- セキュリティ的にはできれば上記のAPIキーはローテーションするのが望ましいが運用コストがかかる(めっちゃ面倒)
- Dynamic Credentialsを設定すると動的にCredentialを発行することができ、セキュリティリスクと運用コストを減らせてハッピー
参考ドキュメント
Hashicorp - Authenticate providers with dynamic credentials
Hashicorp - Dynamic Credentials with the AWS Provider
実装時の流れ
- デプロイ先のAWS上でOIDC IDプロバイダとそれに付与するIAMロールを作成する
- TFCのワークスペースに変数を追加する
事前準備
- あらかじめ必要な設定値
名前 | 説明 |
---|---|
SITE_ADDRESS | Terraform Cloud のアドレス(app.terraform.io を設定) |
AUDIENCE_VALUE | aws.workload.identity を設定 |
ORG_NAME | TFC上のORG NAME |
PROJECT_NAME | ポリシーを適用するTFC上のプロジェクト名 |
WORKSPACE_NAME | ポリシーを適用するTFC上のワークスペース名 |
手順
AWS上でOIDC IDプロバイダを作成する
デプロイ先のAWSアカウントでOIDC IDプロバイダを作成
下記の設定値を入力する
- OpenID Connectを選択
- プロバイダのURL:https://app.terraform.io
- サムプリントを取得を押下する
- 対象者:aws.workload.identity を入力
IDプロバイダが作成されたことを確認する
AWS上でOIDC IDプロバイダに付与するIAMロールを作成する
下記ではterraform planとterraform applyで同一のロールを付与する前提の記載にしています。
planとapplyで別々の権限が必要である場合はロールを分ける形になるので、参考ドキュメントを参照して記述を適切に修正して下さい
- IAMロール作成画面まで遷移
- カスタム信頼ポリシーを選択し、下記の設定を任意の値を差し替えて入力する
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "先ほど作成したOIDC IDプロバイダのARNを入力"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"app.terraform.io:aud": "{AUDIENCE_VALUE}"
},
"StringLike": {
"app.terraform.io:sub": "organization:{ORG_NAME}:project:{PROJECT_NAME}:workspace:{WORKSPACE_NAME}:run_phase:*"
}
}
}
]
}
- 許可ポリシーはデプロイ内容に合わせて適切なものを設定
- 作成したIAMロールのARNを控えておく
TFC上のワークスペースに変数を追加する
- TFCの目的のワークスペースに移動し、Variables画面に遷移する
- Workspace Variables に下記の設定値を入力する( 必須 )
- TFC_AWS_PROVIDER_AUTH(Environment variable):true
- TFC_AWS_RUN_ROLE_ARN(Environment variable):OIDC IDプロバイダに付与したIAMロールのARN
- 必要に応じてオプションの変数の追加も検討する
- (terraform コード内でregionを指定していない場合に設定)AWS_REGION:ap-northeast-1 など
- (IDトークンをデフォルト(aws.workload.identity)から変更する場合の指定)TFC_AWS_WORKLOAD_IDENTITY_AUDIENCE:任意の値
- (planとapplyでroleを分離する場合)TFC_AWS_PLAN_ROLE_ARN:planで利用するIAMロールのARN
- (planとapplyでroleを分離する場合)TFC_AWS_APPLY_ROLE_ARN:applyで利用するIAMロールのARN
これでplan , apply 時に動的なCredentialが発行、利用されるようになるのでterraform plan などを実行して正常に動作するか確認して下さい。