AWS Codebuild Terraform 提供商

AWS Codebuild terraform provider

运行 使用以下 buildspec.yml 在代码构建中部署 terraform。 似乎 terraform 没有获得 codebuild 角色提供的 IAM 权限。 我们正在使用 terraform 的远程状态(状态文件存储在 s3 中),当 terraform 尝试联系包含状态文件的 S3 存储桶时,它死了,要求配置 terraform provider

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

在你buildspec.yml试试:

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

您需要这个是因为 TF 将在容器中未设置的环境变量中查找元数据。

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 角色

如果您 运行 来自 EC2 实例的 Terraform 使用 IAM 角色的 IAM 实例配置文件,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

我讨厌 post 这个,但它将允许 Terraform 访问代码构建 IAM STS 访问密钥并从代码构建中执行 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

编辑:BUG 已修复,如果您在构建规范文件中添加了以下这些行,请删除它们。


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'`

它更具可读性。