Terraform 如果使用相同的名称,则远程状态是有效的(正如预期的那样,因为它在S3中)。我之所以使用env是因为它必须是动态的,因为推送到回购协议的每个分支的环境都是不同的。对于其他所有内容,我使用的是不同的文件夹和状态文件,它们比较简单,但不太灵活。在这种情况下,我觉
Terraform 如果使用相同的名称,则远程状态是有效的(正如预期的那样,因为它在S3中)。我之所以使用env是因为它必须是动态的,因为推送到回购协议的每个分支的环境都是不同的。对于其他所有内容,我使用的是不同的文件夹和状态文件,它们比较简单,但不太灵活。在这种情况下,我觉,terraform,Terraform,如果使用相同的名称,则远程状态是有效的(正如预期的那样,因为它在S3中)。我之所以使用env是因为它必须是动态的,因为推送到回购协议的每个分支的环境都是不同的。对于其他所有内容,我使用的是不同的文件夹和状态文件,它们比较简单,但不太灵活。在这种情况下,我觉得这更像是一个bug。您介意在这里的问题中添加remote.sh源代码(必要时进行编辑或简化)吗?我希望能够帮助您了解后端的配置情况,因为环境如何工作的一些细节取决于后端设置。@MartinAtkins如果有帮助,我已经添加了remote.sh
如果使用相同的名称,则远程状态是有效的(正如预期的那样,因为它在S3中)。我之所以使用env是因为它必须是动态的,因为推送到回购协议的每个分支的环境都是不同的。对于其他所有内容,我使用的是不同的文件夹和状态文件,它们比较简单,但不太灵活。在这种情况下,我觉得这更像是一个bug。您介意在这里的问题中添加
remote.sh
源代码(必要时进行编辑或简化)吗?我希望能够帮助您了解后端的配置情况,因为环境如何工作的一些细节取决于后端设置。@MartinAtkins如果有帮助,我已经添加了remote.sh脚本。所有my helper脚本在执行它们关注的命令之前都会生成remote.sh脚本(正如您在上面的env脚本中看到的那样)。您是否有任何不寻常的/细粒度IAM策略应用于此S3存储桶?我想知道在s3:ListBucket
上是否有任何约束会导致Terraform获得bucket中对象的不完整列表。Terraform查找与某个前缀匹配的对象,以便将对象识别为工作区状态。@MartinAtkins在本地运行时,我可以完全访问此帐户中S3中的所有内容。我的Gitlab CI跑步者有一个更严格的IAM策略,我已将其包括在问题中。
Environment "restrict-dev-websites-internally" doesn't exist!
You can create this environment with the "new" option.
$ terraform env list
default
$ cat .terraform/environment
[ENVIRONMENT NAME]
$ terraform env list
default
$ terraform env list
default
* development
mitchellh-test
#!/bin/sh
set -e
if [ "$#" -ne 2 ]; then
echo "Usage: ./env.sh terraform_target env_name"
echo ""
echo "Example: ./env.sh test test-branch"
fi
TERRAFORM_TARGET_LOCATION=${1}
TERRAFORM_ENV=${2}
REPO_BASE=`git rev-parse --show-toplevel`
TERRAFORM_BASE="${REPO_BASE}"/terraform
. "${TERRAFORM_BASE}"/remote.sh "${TERRAFORM_BASE}"/"${TERRAFORM_TARGET_LOCATION}"
if ! terraform env select ${TERRAFORM_ENV} 2> /dev/null; then
terraform env new ${TERRAFORM_ENV}
fi
#!/bin/sh
set -e
if [ "$#" -ne 2 ]; then
echo "Usage: ./env.sh terraform_target env_name"
echo ""
echo "Example: ./env.sh test test-branch"
fi
TERRAFORM_TARGET_LOCATION=${1}
TERRAFORM_ENV=${2}
REPO_BASE=`git rev-parse --show-toplevel`
TERRAFORM_BASE="${REPO_BASE}"/terraform
. "${TERRAFORM_BASE}"/remote.sh "${TERRAFORM_BASE}"/"${TERRAFORM_TARGET_LOCATION}"
if terraform env select ${TERRAFORM_ENV} 2> /dev/null; then
terraform env select default
terraform env delete ${TERRAFORM_ENV}
fi
#!/bin/sh
set -e
terraform --version
TERRAFORM_TARGET_LOCATION="${1}"
cd "${TERRAFORM_TARGET_LOCATION}"
REPO_NAME="$(basename "`git config --get remote.origin.url`" .git)"
STATE_BUCKET="<BUCKET_NAME>"
STATE_KEY="$(git rev-parse --show-prefix | cut -d"/" -f2-)"
STATE_FILE="terraform.tfstate"
terraform init -backend-config="bucket=${STATE_BUCKET}" \
-backend-config="key=${STATE_KEY}/${STATE_FILE}"
terraform get -update=true
{
"Version" : "2012-10-17",
"Statement": [
{
"Sid" : "1",
"Effect" : "Allow",
"Action" : [ "s3:List*",
"s3:Get*",
"s3:PutObject*" ],
"Resource": [ "arn:aws:s3:::<BUCKET_NAME>",
"arn:aws:s3:::<BUCKET_NAME>/*" ]
},
{
"Sid": "2",
"Effect": "Allow",
"Action": [
"s3:DeleteObject*"
],
"Resource": [
"arn:aws:s3:::<BUCKET_NAME>/env:*"
]
}
]
}