锁定Terraform状态文件以免被覆盖的方法

时间:2020-07-13 18:51:54

标签: amazon-s3 terraform terraform-provider-aws

我们有一个共享的Terraform状态文件,其中包含有关VPC ID,子网ID等的信息,这是存储在Amazon S3存储桶中的共享状态。我们使用状态信息来启动AWS中的各个集群。初始terraform文件不应由admin以外的任何人覆盖,有没有办法将状态锁定在s3中,因此对现有状态没有更改/修改?这可行吗?还是有办法解决!谢谢

2 个答案:

答案 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:PutObjects3: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
}