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:*"
      ]
    }
  ]
}