Способ заблокировать файл состояния Terraform от перезаписи - PullRequest
0 голосов
/ 13 июля 2020

У нас есть общий файл состояния терраформирования, в котором содержится информация о VP C id, su bnet id et c, это общее состояние, хранящееся в корзине Amazon S3. Мы используем информацию о состоянии для раскрутки отдельных кластеров в AWS. Исходный файл terraform не должен перезаписываться кем-либо, кроме администратора, есть ли способ заблокировать состояние в s3, чтобы в существующее состояние не вносились изменения / модификации? Возможно ли это? Или есть выход! Спасибо

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Terraform не может управлять доступом к моментальному снимку состояния в S3, но вы можете использовать политику IAM корзины S3 для управления тем, какие операции разрешены для всей корзины S3 или для определенного пути в S3 ведро, используя пользователей и роли IAM.

Более подробная информация содержится в руководстве по Amazon. Написание политик IAM: как предоставить доступ к корзине Amazon S3 .

В вашем случае , Я думаю, у вас будет два набора политик, каждый из которых связан с различным набором субъектов 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, так что связанные участники имеют доступ только для чтения.

0 голосов
/ 14 июля 2020

S3 не поддерживает блокировку объекта. Вместо этого мы можем минимизировать изменение файла общих состояний, выделив его как другой проект terraform.

В этой ситуации на новый стек 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
}
...