マネジメントコンソールでスイッチロールができることは、皆さまご存知と思います。
IAM User に sts:AssumeRole の権限を与えることで IAM Role の権限を引き受けることができます。
また AWS CLI を実行するときも AssumeRole によって IAM Role の権限を引き受け、その権限で CLI を実行することができます。
同じように Terraform でも AssumeRole した権限で実行できるので、その方法を紹介します。
1. 前提条件
下記は既に存在している前提とします。
- AssumeRole する対象の IAM Role
- 対象 IAM Role を sts:AssumeRole する権限を持った IAM User
2. 変数ファイルの用意
terraform.tfvars という名前のファイルを作成することで、このファイルの中で Terraform に渡す変数を定義できます。
下記のように IAM User の Credential を記載します。
# IAM User's credentials aws_access_key_id = "AKIA****************" aws_secret_access_key = "****************************************"
もちろんこのファイルは Terraform テンプレートの構成管理の中には含めてはいけません。
terraform.tfvars を別の用途でも使っていて構成管理に含めたい場合は、以下のような方法を検討します。
- 別のファイル名で変数定義ファイルを作成してそこにCredentialを定義。 terraform コマンド実行時に
-var-file
オプションで指定する - Credential は
~/.aws/credentials
に定義しておく - Credential は 環境変数で渡す
3. provider の定義
providers.tf 等のファイル名で provider を定義します。
なお前述のように ~/.aws/credentials
や環境変数を利用する場合 access_key =
の行と secret_key =
の行は削除します。
そうすれば自動的にまずは環境変数を、次に ~/.aws/credentials
の default profile を見に行ってくれます。
# Definition of Variables variable "aws_access_key_id" {} variable "aws_secret_access_key" {} # Definition of AWS provider provider "aws" { region = "ap-northeast-1" access_key = var.aws_access_key_id secret_key = var.aws_secret_access_key assume_role { role_arn = "arn:aws:iam::************:role/************" }
これだけで terraform 各種コマンドを実行する際に IAM Role に対し AssumeRole をして引き受けた権限で実行してくれます。
Credential の指定方法はいくつかあるので、下記公式ドキュメントを参考にしましょう、 AWS Provider
杉村 勇馬 (記事一覧)
サーバーワークス → 株式会社G-gen 執行役員CTO
2021 Japan APN Ambassadors / 2021 APN All AWS Certifications Engineers
マルチAWSアカウント管理運用やネットワーク関係のAWSサービスに関するブログ記事を過去に執筆。
2021年09月から株式会社G-genに出向、Google Cloud(GCP)が専門に。G-genでもGoogle Cloud (GCP) の技術ブログを執筆中。