Terraform 错误刷新状态访问被拒绝

问题描述 投票:0回答:10

我将 gitbucket 用于我的存储库和管道。 我有一个配置了远程状态的 terraform 配置文件,它在我的本地计算机上运行良好,但在 gitbucket 中运行时失败。我不断收到访问被拒绝的错误。 这是主要的.tf:

terraform {
backend "s3" {
    bucket = "zego-terraform-test"
    key    = "test/terraform.tfstate"
    region = "eu-west-1"
  }
}

data "terraform_remote_state" "remote_state" {
  backend = "s3"

  config {
    bucket = "zego-terraform-test"
    key    = "test/terraform.tfstate"
    region = "eu-west-1"
  }
}

variable "region" {}

provider "aws" {
  region     = "${var.region}"
  access_key = {}
  secret_key = {}
  token      = {}
}

module "vpc" {
  source = "./modules/vpc"
}

这是我的 gitbucket-pipelines.yml:

image: python:3.5.1
pipelines:
  default:
    - step:
        caches:
          - pip
        script: # Modify the commands below to build your repository.
          - apt-get update
          - apt-get install unzip
          - wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip
          - unzip terraform_0.11.7_linux_amd64.zip
          - rm terraform_0.11.7_linux_amd64.zip
          - export PATH="$PATH:${BITBUCKET_CLONE_DIR}"
          - terraform init
            -backend-config "access_key=$AWS_ACCESS_KEY"
            -backend-config "secret_key=$AWS_SECRET_KEY"
            -backend-config "token=$TOKEN"

当我在此管道中运行 .tf 文件时,出现此错误:

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Error refreshing state: AccessDenied: Access Denied
    status code: 403

当我删除远程状态配置时,它运行正常。 即使我在本地计算机和 gitbucket 环境中使用相同的凭据,为什么我仍会收到访问被拒绝错误?

amazon-s3 terraform bitbucket-pipelines gitbucket
10个回答
23
投票

遇到同样的错误。对于我们的用例,我们必须手动删除

terraform.tfstate
目录下的
.terraform/
文件并再次运行
init


6
投票

如果尚未找到此问题的解决方案,您可以在 terraform_remote_state 节的配置部分中使用“profile=”或“role_arn=”。 AWS Provider 和后端配置也是如此。

我今天一整天都在追这个问题,没有意识到 role_arn 可用于 terraform_backend_state 数据源。


4
投票

当我使用多个使用配置文件名称的 aws 帐户时,也发生了同样的错误。
就我而言,我在后端配置中缺少

profile
属性。添加了配置文件并删除了
.terraform
目录,然后运行
terraform init
- 它起作用了。

terraform {
  required_version = ">= 1.0.0"
  backend "s3" {
    // here!
    profile = "crazyoptimist"
    bucket = "devops-terraform-crazyoptimist"
    key = "terraform.tfstate"
    region = "us-west-2"
    encrypt = true
  }
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

provider "aws" {
  region = "us-west-2"
  profile = "crazyoptimist"
}

3
投票

在 terraform 后端之间切换时可能会出现此错误。要解决此问题,您可以运行

terraform init -reconfigure
将后端配置为新后端。
它将获得与删除
terraform.tfstate
下的
.terraform
文件并运行
terraform init
相同的结果。


1
投票

乍一看似乎很有道理。您是否尝试过将 terraform init 和 -backend-config 全部放在一行上?我想知道开头的 - 是否弄乱了 yml 格式?


1
投票

在 codebuild 中运行 terraform init 命令时收到相同的错误,只需授予 s3 存储桶访问为 codebuild 创建的角色的权限即可解决错误


0
投票

在我的例子中,data.tf 的一个数据块的后端文件存在权限问题,我只是重新创建了该文件并再次执行了 terraform plan,问题就解决了。花了很长时间才弄清楚这一点。

data "terraform_remote_state" "gateway" {
  backend = "s3"

  config = {
    bucket = "xxx-terraform-remote"
    key    = "xxx/terraform.tfstate"
    region = "eu-west-1"
  }
}

0
投票

就我而言,AWS 客户端查找凭证的顺序存在问题。

我将 terreform 使用的 AWS 凭证存储在

 ~/.aws/credentials
中,但我还在环境变量中设置了不同的 AWS 凭证。

我必须从我的环境变量中删除 AWS 凭证,它起作用了。


0
投票

Terraform 将需要对目标后端存储桶具有以下 AWS IAM 权限:

arn:aws:s3:::mybucket 上的 s3:ListBucket

s3:在 arn:aws:s3:::mybucket/path/to/my/key 上获取对象

s3:将对象放在 arn:aws:s3:::mybucket/path/to/my/key 上

s3:删除 arn:aws:s3:::mybucket/path/to/my/key 上的对象

enter image description here


0
投票

个人资料凭证似乎有效,但权限不足

尝试:

  1. 导航

    IAM -> Users -> wb-cli -> permissions tab -> Add permission

  2. 添加

    AdministratorAccess
    或选择您希望授予用户的特定权限。

© www.soinside.com 2019 - 2024. All rights reserved.