3

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

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

4 回答 4

7

编辑:错误已修复,如果您将它们添加到构建规范文件中,请删除下面的这些行。


在 之前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'`

它更具可读性。

于 2018-01-04T21:48:33.923 回答
1

在你 buildspec.yml 尝试:

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

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

于 2017-05-17T04:30:22.993 回答
0

我讨厌发布此内容,但它将允许 terraform 访问 codebuild IAM STS 访问密钥并从 codebuild 作为 buildspec.yml 执行 terraform 命令

这对于 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
于 2017-07-15T07:15:46.347 回答
-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-安全凭证

于 2017-06-09T08:49:10.597 回答