我们有一个共享的Terraform状态文件,其中包含有关VPC ID,子网ID等的信息,这是存储在Amazon S3存储桶中的共享状态。我们使用状态信息来启动AWS中的各个集群。初始terraform文件不应由admin以外的任何人覆盖,有没有办法将状态锁定在s3中,因此对现有状态没有更改/修改?这可行吗?还是有办法解决!谢谢
答案 0 :(得分:1)
Terraform本身无法控制对S3中状态快照的访问,但是可以使用IAM用户使用S3 bucket IAM policies来控制整个S3存储桶或S3存储桶中的特定路径所允许的操作和角色。
Amazon指南Writing IAM Policies: How to Grant Access to an Amazon S3 Bucket中有更多信息。
在您的情况下,我认为您将有两组策略语句,它们分别与一组不同的IAM主体(用户或角色)相关联。第一种将向您的管理员授予写访问权限,这可能类似于控制台访问指南中的示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucketname"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::bucketname/stateobject.tfstate"]
}
]
}
第二个方法是向有需要的人授予读取权限,这与上面的非常相似,但是将排除s3:PutObject
和s3:DeleteObject
操作,以便关联的主体只能读取访问。
答案 1 :(得分:0)
S3不支持锁定对象。取而代之的是,我们可以通过将其单独作为另一个terraform项目来最小化共享状态文件的更改。
在这种情况下,可以通过remote state引用新的Terraform堆栈。作为普通用户,他们只需要在申请时对s3://terraform-state-prod/network/terraform.tfstate
拥有读取权限。
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "terraform-state-prod"
key = "network/terraform.tfstate"
region = "us-east-1"
}
}
resource "aws_instance" "foo" {
# ...
subnet_id = data.terraform_remote_state.network.outputs.subnet_id
}