代码之家  ›  专栏  ›  技术社区  ›  Thayne

如何在本地exec provisioner中从terraform继承aws凭据

  •  0
  • Thayne  · 技术社区  · 6 年前

    我有一个terraform中的资源,我需要在它创建后运行AWS命令。但我希望它使用terraform使用的AWS凭据运行。AWS提供商正在使用一个配置文件,然后使用该配置文件承担一个角色:

    provider "aws" {
      profile = "terraform"
      assume_role {
        role_arn = local.my_arn
      }
    }
    

    我曾希望terraform能够暴露出必要的环境变量,但事实似乎并非如此。最好的方法是什么?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Carlo Mencarelli    6 年前

    你能通过AWS配置使用角色假设吗?医生: Using an IAM Role in the AWS CLI

    ~/.aws/config:

    [user1]
    aws_access_key_id =  ACCESS_KEY
    aws_secret_access_key = SECRET_KEY
    
    [test-assume]
    role_arn = arn:aws:iam::123456789012:role/test-assume
    source_profile = user1
    

    主要的tf:

    provider "aws" {
      profile = var.aws_profile
      version = "~> 2.0"
      region  = "us-east-1"
    }
    
    variable "aws_profile" {
      default = "test-assume"
    }
    
    resource "aws_instance" "instances" {
      ami           = "ami-009d6802948d06e52"
      instance_type = "t2.micro"
      subnet_id     = "subnet-002df68a36948517c"
    
      provisioner "local-exec" {
        command = "aws sts get-caller-identity --profile ${var.aws_profile}"
      }
    }
    

    如果你做不到,这里有一个非常混乱的方法。我并不特别推荐这种方法,但它会管用的。这依赖于 jq 但您也可以使用其他东西来解析 aws sts assume-role 命令

    主要的tf:

    provider "aws" {
      profile = var.aws_profile
      version = "~> 2.0"
      region  = "us-east-1"
      assume_role {
        role_arn = var.assume_role
      }
    }
    
    variable "aws_profile" {
      default = "default"
    }
    
    variable "assume_role" {
      default = "arn:aws:iam::123456789012:role/test-assume"
    }
    
    resource "aws_instance" "instances" {
      ami           = "ami-009d6802948d06e52"
      instance_type = "t2.micro"
      subnet_id     = "subnet-002df68a36948517c"
    
      provisioner "local-exec" {
        command = "aws sts assume-role --role-arn ${var.assume_role} --role-session-name Testing --profile ${var.aws_profile} --output json > test.json && export AWS_ACCESS_KEY_ID=`jq -r '.Credentials.AccessKeyId' test.json` && export AWS_SECRET_ACCESS_KEY=`jq -r '.Credentials.SecretAccessKey' test.json` && export AWS_SESSION_TOKEN=`jq -r '.Credentials.SessionToken' test.json` && aws sts get-caller-identity && rm test.json && unset AWS_ACCESS_KEY_ID && unset AWS_SECRET_ACCESS_KEY && unset AWS_SESSION_TOKEN"
      } 
    }