AWS Codebuild terraform提供程序

时间:2017-05-16 14:59:11

标签: amazon-web-services terraform aws-codebuild

使用以下buildspec.yml在codebuild中运行terraform deploy。 似乎terraform没有获得codebuild角色提供的IAM权限。 我们正在使用terraform的远程状态(状态文件存储在s3中),当terraform尝试联系包含状态文件的S3存储桶时,它要求配置地形provider:< / p>

Downloading modules (if any)...
Get: file:///tmp/src486521661/src/common/byu-aws-accounts-tf
Get: file:///tmp/src486521661/src/common/base-aws-account-
...
Error configuring the backend "s3": No valid credential sources found for AWS Provider.

这里是buildspec.yml:

version: 0.1
phases:
  install:
    commands:
      - cd common && git clone https://eric.w.nord@gitlab.com/aws-account-tools/acs.git
      - export TerraformVersion=0.9.3 && cd /tmp && curl -o terraform.zip https://releases.hashicorp.com/terraform/${TerraformVersion}/terraform_${TerraformVersion}_linux_amd64.zip && unzip terraform.zip && mv terraform /usr/bin
  build:
    commands:
      - cd accounts/00/dev-stack-oit-byu && terraform init && terraform plan && echo terraform apply

4 个答案:

答案 0 :(得分:6)

编辑:BUG已被修复,如果您在buildpec文件中添加了这些行,请删除以下这些行。

terraform init之前,添加以下行:

  export AWS_ACCESS_KEY_ID=`curl --silent 169.254.170.2:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq -r '.AccessKeyId'`
  export AWS_SECRET_ACCESS_KEY=`curl --silent 169.254.170.2:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq -r '.SecretAccessKey'`
  export AWS_SESSION_TOKEN=`curl --silent 169.254.170.2:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq -r '.Token'`

它更具可读性。

答案 1 :(得分:1)

在你的buildspec.yml中尝试:

env:
  variables:
    AWS_METADATA_ENDPOINT: "http://169.254.169.254:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"

您需要这是因为TF将在env var中查找未在容器中设置的元数据。

答案 2 :(得分:0)

我讨厌发布这个但是它允许terraform访问codebuild IAM STS访问密钥并从codebuild中执行terraform命令作为buildspec.yml

对于AWS基础架构的自动部署非常方便,因为您可以将CodeBuild放入所有AWS账户并使用CodePipeline触发它们。

请注意版本:0.2 这会在命令之间传递envars,因为版本0.1为每个命令都有一个干净的shell

如果您找到更好的内容,请更新:

version: 0.2
env:
  variables:
    AWS_DEFAULT_REGION: "us-west-2"
phases:
  install:
    commands:
      - apt-get -y update
      - apt-get -y install jq
  pre_build:
      commands:

      # load acs submodule (since codebuild doesn't pull the .git folder from the repo
      - cd common 
      - git clone https://gituser@gitlab.com/aws-account-tools/acs.git
      - cd ../

      #install terraform
      - other/install-tf-linux64.sh
      - terraform --version

      #set env variables for terraform provider
      - curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq 'to_entries | [ .[] | select(.key | (contains("Expiration") or contains("RoleArn"))  | not) ] |  map(if .key == "AccessKeyId" then . + {"key":"AWS_ACCESS_KEY_ID"} else . end) | map(if .key == "SecretAccessKey" then . + {"key":"AWS_SECRET_ACCESS_KEY"} else . end) | map(if .key == "Token" then . + {"key":"AWS_SESSION_TOKEN"} else . end) | map("export \(.key)=\(.value)") | .[]' -r > /tmp/cred.txt # work around https://github.com/hashicorp/terraform/issues/8746
      - chmod +x /tmp/cred.txt
      - . /tmp/cred.txt
  build:
    commands:
      - ls
      - cd your/repo's/folder/with/main.tf 
      - terraform init 
      - terraform plan 
      - terraform apply

答案 3 :(得分:-1)

Terraform AWS提供商提供以下身份验证方法:

静态凭据

在这种情况下,您可以将访问和密钥直接添加到tf配置文件中,如下所示:

provider "aws" {
  region     = "us-west-2"
  access_key = "anaccesskey"
  secret_key = "asecretkey"
}

环境变量

将访问和密钥导入环境变量。使用导出命令

执行此操作
$ export AWS_ACCESS_KEY_ID="anaccesskey"
$ export AWS_SECRET_ACCESS_KEY="asecretkey"

共享凭据文件

如果Terraform无法内联或在环境中检测凭据,Terraform将检查此位置,$ HOME / .aws / credentials,在这种情况下,您无需在Terraform配置中提及或放置凭据

EC2角色

如果您使用IAM角色从具有IAM实例配置文件的EC2实例运行Terraform,Terraform将只询问元数据API端点的凭据。在这种情况下,您不必在任何配置中提及访问和秘密密钥。这是首选方式

https://www.terraform.io/docs/providers/aws/ http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials