TerraformをAssumeRoleした権限で実行したい

記事タイトルとURLをコピーする

マネジメントコンソールでスイッチロールができることは、皆さまご存知と思います。
IAM User に sts:AssumeRole の権限を与えることで IAM Role の権限を引き受けることができます。

また AWS CLI を実行するときも AssumeRole によって IAM Role の権限を引き受け、その権限で CLI を実行することができます。

同じように Terraform でも AssumeRole した権限で実行できるので、その方法を紹介します。

f:id:swx-yuma-sugimura:20200926124136p:plain

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