amazon-web-services – 在terraform中获取IAM用户名

我们有许多IAM用户,都使用Terraform在EC2上创建自助服务基础架构.用户不一定为其实例设置密钥,因此很难将实例绑定到特定用户.我意识到我们可以挖掘CloudTrail来找出哪些用户正在创建实例,但似乎用当前的IAM用户名标记实例会更简单.

问题是Terraform似乎没有暴露这个 – 我可以使用aws_caller_identity或aws_canonical_user_id,但它们似乎都返回组织帐户,而不是特定的IAM用户名. Terraform中是否有数据源会返回创建实例的IAM用户?

最佳答案 它看起来像
aws_caller_identity
doesn’t actually call
STS GetCallerId endpoint,它能够提供您需要的信息 – 特别是UserId和运行该命令的用户的Arn.

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

所以你在这里有几个选择.您可以提出一个pull请求,让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
    }
}

上面的Terraform将正常创建一个EC2实例,但忽略“Owner”标签.创建实例后,它将运行本地shell脚本,该脚本为用户提取IAM帐户名/角色,然后使用该值为实例创建“Owner”标记.

点赞