【发布时间】: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