我已经将一个现有的S3存储桶导入到我的terraform
状态。
我现在正在尝试对其配置进行反向工程,并将其传递到.tf
文件。
这是我的文件
resource "aws_s3_bucket" "my-bucket" {
provider = "aws.eu_west_1"
bucket = "my-bucket"
grant {
type = "Group"
permissions = ["READ_ACP", "WRITE"]
uri = "http://acs.amazonaws.com/groups/s3/LogDelivery"
}
grant {
id = "my-account-id"
type = "CanonicalUser"
permissions = ["FULL_CONTROL"]
}
这是我的terraform plan
输出
~ aws_s3_bucket.my-bucket
acl: "" => "private"
无论我对acl
使用什么值,我总是无法将我的tf
与S3存储桶上的现有acl
配置对齐,例如
resource "aws_s3_bucket" "my-bucket" {
provider = "aws.eu_west_1"
bucket = "my-bucket"
acl. = "private"
对应的plan
输出:
Error: aws_s3_bucket.my-bucket: "acl": conflicts with grant
Error: aws_s3_bucket.my-bucket: "grant": conflicts with acl
和另一个:
resource "aws_s3_bucket" "my-bucket" {
provider = "aws.eu_west_1"
bucket = "my-bucket"
acl. = ""
resource "aws_s3_bucket" "my-bucket" {
provider = "aws.eu_west_1"
bucket = "my-bucket"
acl. = ""
因此,如果我不使用acl的值,terraform
显示acl
将从未设置更改为private
如果我使用任何值,我都会得到一个错误。
为什么?
这是对0.13的观察,但仍然可能有所帮助:
如果我使用原始代码创建了一个bucket(即没有acl行(,那么生成的TF状态文件仍然包括bucket的"acl": "private",
属性。如果我随后添加一个acl="0";私人的";TF代码中的定义,我在尝试应用时也得到了"acl": conflicts with grant
。
但真正奇怪的是,如果我删除acl="private"
定义(即恢复到原始代码(,并从状态文件中删除"acl": "private",
属性行,那么计划(包括刷新(显示bucket将用以下内容更新:+ acl = "private"
。申请这个似乎很有效,但第二次申请表明拨款已经丢失,需要重新申请。
因此,在我看来,S3状态刷新中有一个错误,可能也会影响导入,此外,从状态中明显删除acl属性会使其错误地作为默认值应用,从而覆盖任何授予。我认为,使用您的代码创建一个新的bucket,然后比较状态定义,以恢复原始导入遗漏的任何位可能是值得的。