在 terraform 中获取 IAM 用户名

Getting IAM username in terraform

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

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

看起来 aws_caller_identity doesn't actually call the STS GetCallerId endpoint 可以提供您需要的信息 - 特别是用户的 UserId 和 Arn 运行正在执行命令。

相反,它采用更简单的选项,仅使用 AWS 客户端已经定义的 accountid 和简单的 returns。

所以你在这里有几个选择。您可以提出拉取请求,让 aws_caller_identity 数据源实际调用 STS GetCallerId 端点,或者您可以 shell 使用本地供应商并使用它来标记您的资源。

显然,如果人们正在编写 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 实例,但随后会忽略“所有者”标签。创建实例后,它将 运行 本地 shell 脚本为用户获取 IAM 帐户 name/role,然后使用该值为实例创建“所有者”标签。

要处理多个实例(使用计数),您可以参考以下代码:

resource "aws_instance" "instance" {
    count           = "${var.instance_number}"
    ami             = "ami-xxxxxx"
    instance_type   = "${var.instance_type}"
    security_groups = "${concat(list("sg-xxxxxx"),var.security_groups)}"
    disable_api_termination = "${var.termination_protection}"
    subnet_id       = "${var.subnet_id}"
    iam_instance_profile = "test_role"
    tags {
            Name        = "prod-${var.cluster_name}-${var.service_name}-${count.index+1}"
            Environment = "prod"
            Product     = "${var.cluster_name}"
    }
    lifecycle {
        ignore_changes = [ "tags.LaunchedBy" ]
    }
    provisioner "local-exec" {
        command = <<EOF
launched_by=`aws iam get-user --profile prod | python -mjson.tool | grep UserName | awk '{print ;exit; }'`
aws ec2 create-tags --resources ${self.id} --tags Key=LaunchedBy,Value=$${launched_by}
EOF
    }
}