使用以下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
答案 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