terraform - 如何在 local-exec 配置程序中从 terraform 继承 aws 凭据
问题描述
我在 terraform 中有一个资源,我需要在它创建后运行 AWS 命令。但我希望它使用 terraform 使用的相同 AWS 凭证运行。AWS 提供商正在使用一个配置文件,然后它使用该配置文件来承担角色:
provider "aws" {
profile = "terraform"
assume_role {
role_arn = local.my_arn
}
}
我曾希望 terraform 会公开必要的环境变量,但似乎并非如此。做这个的最好方式是什么?
解决方案
您可以通过 AWS 配置使用角色假设吗?文档:在 AWS CLI 中使用 IAM 角色
~/.aws/配置:
[user1]
aws_access_key_id = ACCESS_KEY
aws_secret_access_key = SECRET_KEY
[test-assume]
role_arn = arn:aws:iam::123456789012:role/test-assume
source_profile = user1
主文件:
provider "aws" {
profile = var.aws_profile
version = "~> 2.0"
region = "us-east-1"
}
variable "aws_profile" {
default = "test-assume"
}
resource "aws_instance" "instances" {
ami = "ami-009d6802948d06e52"
instance_type = "t2.micro"
subnet_id = "subnet-002df68a36948517c"
provisioner "local-exec" {
command = "aws sts get-caller-identity --profile ${var.aws_profile}"
}
}
如果你不能,这是一种非常混乱的方法。我不特别推荐这种方法,但它会起作用。这依赖于jq
但您也可以使用其他东西来解析aws sts assume-role
命令的输出
主文件:
provider "aws" {
profile = var.aws_profile
version = "~> 2.0"
region = "us-east-1"
assume_role {
role_arn = var.assume_role
}
}
variable "aws_profile" {
default = "default"
}
variable "assume_role" {
default = "arn:aws:iam::123456789012:role/test-assume"
}
resource "aws_instance" "instances" {
ami = "ami-009d6802948d06e52"
instance_type = "t2.micro"
subnet_id = "subnet-002df68a36948517c"
provisioner "local-exec" {
command = "aws sts assume-role --role-arn ${var.assume_role} --role-session-name Testing --profile ${var.aws_profile} --output json > test.json && export AWS_ACCESS_KEY_ID=`jq -r '.Credentials.AccessKeyId' test.json` && export AWS_SECRET_ACCESS_KEY=`jq -r '.Credentials.SecretAccessKey' test.json` && export AWS_SESSION_TOKEN=`jq -r '.Credentials.SessionToken' test.json` && aws sts get-caller-identity && rm test.json && unset AWS_ACCESS_KEY_ID && unset AWS_SECRET_ACCESS_KEY && unset AWS_SESSION_TOKEN"
}
}
推荐阅读
- c++ - BGL:无法访问捆绑的顶点属性
- javascript - $(window).on('load') 不适用于 Mozilla Firexfox
- php - PHP move_upload_file(); 不移动到新文件夹
- node.js - connect-mongo、passport 和 passport-local-mongoose 问题,会话不持久
- android - ImageView AlignParentBottom
- python - Keras Conv2D:过滤器与 kernel_size
- node.js - Node JS - 运行 app.js 的自定义命令
- android - 无法打开opencv处理的图像android
- javascript - 如何使用 jQuery 动态更改输入内容
- android - React Native & VS Code - 断点没有被命中