在进行terraform配置时,可以使用switch role或MFA环境来执行,而无需硬编码ARN角色于AWS provider或S3 backend的设置中
简要概述
由于在使用具有MFA认证的IAM用户权限进行切换角色来执行Terraform时很麻烦,所以我会提供一种解决方法。
据说,如果在运行时将要使用的切换角色的ARN硬编码到aws provider或s3 backend配置中,则可以很简单地完成。但是,角色是依赖于环境(开发/测试/生产)的,因此不想要硬编码。
有许多人遇到了类似的问题,提出了几个相关的问题。
其中,一个类似于terraform开发者的人评论说:“terraform意识到自动执行,所以不支持通过交互输入MFA的一次性密码!” 我根据这个评论作为线索进行了解决方法的调查。
在MFA和切换角色环境中
预先设置
假设~/.aws/config和credentials文件已经按照通常方法配置好了。不要忘记不要写入mfa的相关内容。
以下是要点。
-
- source profile のアカウントへのログインには MFA が必要
- target profile のとこに MFA の設定は記述しない
[profile source]
output = json
region = ap-northeast-1
[profile target]
role_arn = <arn of role to switch>
source_profile = source
region = ap-northeast-1
# mfa の設定は記述しない
[source]
aws_access_key_id = <your access key id>
aws_secret_access_key = <your secret key>
下载 jq 命令,并将其添加到环境变量中。
在运行terraform之前执行一些操作
重要的是在 IAM 认证时提前获取并设置会话令牌。
# 環境変数をクリアする。環境変数に認証情報が残っていると aws cli, sdk に(意図せずに)参照されてしまう。
unset AWS_SHARED_CREDENTIALS_FILE
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
# token を取得する
export AWS_PROFILE=source # changeme
aws sts get-session-token --serial-number <your mfa device serial number> --token-code <one time code> > tmp.token
aws_access_key_id=`cat tmp.token| jq -r ".Credentials.AccessKeyId"`
aws_secret_access_key=`cat tmp.token| jq -r ".Credentials.SecretAccessKey"`
aws_session_token=`cat tmp.token| jq -r ".Credentials.SessionToken"`
# .aws/credentials ファイルとは別に credentials ファイルを作成し、terraform 実行時に参照する。
export AWS_SHARED_CREDENTIALS_FILE=tmp.credentials # 参照する credentials ファイルを変更する。
cat << EOF > $AWS_SHARED_CREDENTIALS_FILE
[source]
aws_session_token=$aws_session_token
aws_secret_access_key=$aws_secret_access_key
aws_access_key_id=$aws_access_key_id
EOF
export AWS_SDK_LOAD_CONFIG=1 # terraform AWS provider v3.0.0 以降は default 設定なので指定不要っぽい
export AWS_PROFILE=target # changeme
以后,您可以像通常一样执行terraform。
我们通过AWS_SHARED_CREDENTIALS_FILE=tmp.credentials设置,以查看包含会话令牌的凭证文件。
在没有多因素认证的切换角色环境中
预先设置
假设~/.aws/config和credentials文件已经按照正常方式进行了设置。
在执行terraform之前执行
export AWS_SDK_LOAD_CONFIG=1 # terraform AWS provider v3.0.0 以降は default 設定なので指定不要っぽい
export AWS_PROFILE=target # changeme
然后,您可以像往常一样执行 terraform。
参考:我在terraform配置中尝试了上述设置。
后端使用了 S3。
terraform {
required_version = ">= 0.12.26"
backend "s3" {}
}
# Configure the AWS Provider
provider "aws" {
version = ">= 2.62.0"
region = "ap-northeast-1"
}
backend.hcl被按照环境设置准备好了。
bucket = <dev 用の bucket 名>
key = "sample_terraform.tfstate"
region = "ap-northeast-1"
encrypt = true
Terraform执行命令如下。
ENV="dev"
export TF_DATA_DIR=./.terraform/$ENV
terraform init -backend-config=env/${ENV}/backend.hcl
terraform apply -var="env=${ENV}"
总结
我不想把时间浪费在这种无关紧要的事情上。
希望能对某人有所帮助。
如果您知道更加优雅的方法,请告诉我。