在 terraform 中获取 IAM 用户名

ala*_*ner 6 amazon-ec2 amazon-web-services terraform

我们有许多 IAM 用户,他们都使用 Terraform 在 EC2 上创建自助服务基础设施。用户不一定为其实例设置密钥,因此很难将实例与特定用户绑定。我意识到我们可以通过 CloudTrail 深入了解哪些用户正在创建实例,但使用当前 IAM 用户名标记实例似乎更简单。

问题是 Terraform 似乎没有公开这一点 - 我可以使用aws_caller_identityaws_canonical_user_id,但它们似乎都返回组织帐户,而不是特定的 IAM 用户名。Terraform 中是否有数据源会返回创建实例的 IAM 用户?

yda*_*coR 3

它看起来实际上并没有调用STS GetCallerId 端点,该端点能够提供您需要的信息 - 特别是运行命令的用户的 UserId 和 Arn。aws_caller_identity

相反,它采用更简单的选项,只使用accountidAWS 客户端已经定义的并简单地返回它。

所以你有几个选择。您可以提出拉取请求,让aws_caller_identity数据源实际调用 STS GetCallerId 端点,或者您可以使用本地配置程序来标记您的资源。

显然,如果人们编写 Terraform 来直接使用 Terraform 提供的原始资源,那么除了让某些东西杀死任何未标记的东西之外,您无法真正强制执行此操作,但这仍然留下了人们使用其他人的 UserId 或 Arn 标记事物的问题。

相反,如果您有一堆模块,然后人们可以使用这些模块,那么您可以在创建 EC2 实例的模块中做一些丑陋的事情:

resource "aws_instance" "instance" {
    ami = "ami-123456"
    instance_type = "t2.micro"
    tags {
        Name = "HelloWorld"
    }
    lifecycle {
        ignore_changes = [ "tags.Owner" ]
    }
    provisioner "local-exec" {
        command = <<EOF
owner=`aws sts get-caller-identity --output text --query 'Arn' | cut -d"/" -f2`
aws ec2 create-tags --resources ${self.id} --tags Key=Owner,Value=$${owner}
EOF
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的 Terraform 将照常创建一个 EC2 实例,但随后忽略“Owner”标签。创建实例后,它将运行一个本地 shell 脚本,获取用户的 IAM 账户名称/角色,然后使用该值为实例创建一个“所有者”标签。