這篇要講的是 Terraform 對於 AWS Assume role 的用法,官方文件上有寫「Assume role」的作法,不過我實際上的情境是由 Jump Account 跳到 Project Account 的 Assume role 方式,其實文件上也是有寫,只是並不怎麼明確,所以用這篇記錄用法
由於現有團隊會需要管理非常多的 AWS Account,所以會統一由一個 Jump Account 來 Switch Role 到其他的 Project Account,這時候 Assume role 就會是很常用到的項目
原本看官方文件單純使用 assume_role 的方式沒辦法直接 Assume role,查了一下 terraform 的一個 issue「AWS assume role not working」和我的情境相同
首先必須在 ~/.aws/credentials 要有 Jump Account 的 Credentials Profile,像這樣:
[jump-account] aws_access_key_id = foo aws_secret_access_key = bar
然後在 Terraform 我就可以透過 [jump-account] 來 Assume role 到其他 Project Account,其實概念和你在 manage console 上操作 Switch Role 相同。
provider "aws" { profile = "jump-account" region = "us-east-1" assume_role { role_arn = "arn:aws:iam::<DESTINATION_AWS_ACCOUNT_NUMBER>:role/user/myadminrole" session_name = "terraform" } }
這樣就可以不需要儲存 credentials 而且透過 Jump Account 的方式來管理更方便。
另外如果你用 sts 的方式可以用 AccessKey、SecretKey、Token 登入:
provider "aws" { region = "${var.region}" access_key = "${var.aws_access_key}" secret_key = "${var.aws_secret_key}" token = "${var.aws_token}" }
因為是使用 var 來抓變數,所以必須先 export AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN。
export AWS_ACCESS_KEY_ID=foo export AWS_SECRET_ACCESS_KEY=bar export AWS_SESSION_TOKEN=baz