【问题标题】:terraform backend s3 bucket creation returns 403 w/ Terraform 0.11.1terraform 后端 s3 存储桶创建返回 403 w/ Terraform 0.11.1
【发布时间】:2018-05-29 14:14:38
【问题描述】:

如何创建有权放置 terraform.tfstate 文件的 S3 存储桶?如何将 tfstate 放入存储桶?这样做的正确方法是什么?

作为序言,我花了 6 个多小时试图弄清楚这一点。我看到 similar post 出现了由 MFA 引起的问题。那不是我的问题。

我使用相同的代码来创建 EC2 实例、VPC 和其他资源就好了。

---[ REQUEST POST-SIGN ]-----------------------------
GET /?prefix=env%3A%2F HTTP/1.1
Host: tfstate-neonaluminum.s3.us-east-2.amazonaws.com
User-Agent: aws-sdk-go/1.10.36 (go1.9.2; darwin; amd64) APN/1.0 HashiCorp/1.0 Terraform/0.11.1
Authorization: AWS4-HMAC-SHA256 Credential=<CUT>/20171215/us-east-2/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=<CUT>
X-Amz-Content-Sha256: <CUT>
X-Amz-Date: 20171215T103755Z
Accept-Encoding: gzip

-----------------------------------------------------
2017/12/15 04:37:55 [DEBUG] [aws-sdk-go] DEBUG: Response s3/ListObjects Details:
---[ RESPONSE ]--------------------------------------
HTTP/1.1 403 Forbidden
Connection: close
Transfer-Encoding: chunked
Content-Type: application/xml
Date: Fri, 15 Dec 2017 10:37:55 GMT
Server: AmazonS3
X-Amz-Bucket-Region: us-east-2
X-Amz-Id-2: UwWJlCAtabKny2Ncam+D7/s9Rozjw43ozsVNdtZgQqPSXoSvZbO3JnuPz3B9cmLcgYea6x8xPqQ=
X-Amz-Request-Id: 470C02B96A60090B

这是 .tf 代码:

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

terraform {
   backend "s3" {
    bucket = "tfstate-neonaluminum"
       key = "terraform.tfstate"
    region = "us-east-2"
  }
}
resource "aws_s3_bucket" "terraform_state_bucket" {
  bucket = "tfstate-neonaluminum"
  acl = "private"
  tags {
    management = "terraform"
  }
}

希望我没有遗漏任何必要的细节 - 刚开始在 stackoverflow 上提问。

【问题讨论】:

  • 您提供的密钥 (var.aws_access_key) 是否对 s3 存储桶 tfstate-neonaluminum 具有写入和列出权限?
  • 实际上是否可以使用 s3 作为后端,而存储桶也是由 Terraform 创建的?我不确定哪种方式,但我希望在 Terraform 可以运行之前存储桶必须存在,否则它将如何拉入状态文件?
  • 是的,我已经使用 terraform 创建了 S3 存储桶。我假设我可以使用创建存储桶的相同密钥来写入存储桶?

标签: amazon-web-services amazon-s3 terraform


【解决方案1】:

不幸的是,这是使用 S3 作为 Terraform 后端的一个警告;您需要手动创建存储桶。有时——一种常见的模式是一个组织将拥有多个 AWS 账户(出于各种原因——不仅仅是 Terraform 状态)——这可能是一个可能的选择,在该账户中创建你的 S3 存储桶,这样你就可以保持所有由 Terraform 定义的其他帐户的基础架构 - 但就我个人而言,我只是在自己的帐户中手动创建。

您可以做的一件事是使用terraform import 在事后导入存储桶,如果您想使用 Terraform 管理它,当然还有先有鸡还是先有蛋的问题。或者 - 在创建存储桶时最初使用本地状态,然后再定义它;但是无论哪种方式,您都无法通过资源对象动态引用存储桶。

但不行 - 您不能同时使用 Terraform 创建存储桶,同时将其设置为您的状态。

【讨论】:

  • 这是有道理的。我实际上已经创建了一个本地状态文件,并且想将 tf 脚本更改为使用远程状态文件。
  • 我的 S3 存储桶是远程创建的。我可以通过控制台在 S3 中删除 tf 状态文件吗?
  • @Neal 只需将其从本地更改为远程并运行应用程序 - Terraform 将为您完成
猜你喜欢
  • 2021-12-30
  • 2022-01-12
  • 2018-05-20
  • 1970-01-01
  • 2021-08-14
  • 2020-02-05
  • 2019-05-14
  • 2023-03-07
  • 2022-11-03
相关资源
最近更新 更多