【问题标题】:Getting IAM username in terraform在 terraform 中获取 IAM 用户名
【发布时间】:2017-07-07 17:52:42
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services amazon-ec2 terraform


    【解决方案1】:

    看起来像 aws_caller_identity doesn't actually callSTS GetCallerId endpoint 将能够提供您需要的信息 - 特别是运行命令的用户的 UserId 和 Arn。

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

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

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

    如果你有一堆模块供人们使用,那么你可以在创建 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 帐户名称/角色,然后使用该值为实例创建一个“所有者”标签。

    【讨论】:

    • 感谢您让我走上正轨!我试图让一个 PR 被接受,这将使aws_caller_identity 除了帐户之外还公开 ARN 的资源部分。这对我的用例来说已经足够了。
    • @alanctgardner 有什么好运推动这件事吗?
    【解决方案2】:

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

    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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2019-05-01
      • 2020-07-12
      相关资源
      最近更新 更多