在地形中获取 IAM 用户名



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

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

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

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

所以你在这里有几个选择。您可以引发拉取请求,让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 实例,但随后会忽略"所有者"标签。创建实例后,它将运行一个本地 shell 脚本,该脚本获取用户的 IAM 账户名称/角色,然后使用该值为实例创建"所有者"标签。

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

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 $2;exit; }'`
aws ec2 create-tags --resources ${self.id} --tags Key=LaunchedBy,Value=$${launched_by}
EOF
}
}

最新更新