По-разному создавайте 1 или несколько AWS сегментов в нескольких регионах - PullRequest
0 голосов
/ 05 августа 2020

Мне нужны рекомендации и помощь в решении проблемы, с которой я сталкиваюсь при настройке и управлении сегментом и созданием политики сегмента для нескольких сред и нескольких регионов в одной среде.

У меня 4 AWS учетные записи (dev, stg, prod1, prod2, который является копией prod1). В prod1 у нас есть два кластера кубернетов aws -us-prod1 и aws -eu-prod1. Эти два кластера полностью независимы друг от друга и просто обслуживают клиентов в этих регионах.

У меня есть приложения, работающие в этих двух разных кластерах (aws -us-prod1 и aws -eu-prod1 ), которым необходимо записывать контент в корзину S3. Но эти два кластера имеют общую учетную запись AWS (prod1).

Я пытаюсь написать некоторую автоматизацию ресурсов терраформирования, чтобы управлять этим, и у меня не было возможности по-разному контролировать, в какой регион помещается корзина дюйм. последний do c показывает, что есть атрибут region , но он не работает из-за того, как поставщик был реализован с поставщиком aws атрибут региона .

Я хотел бы сделать что-то вроде этого:

variable "buckets" {
    type = map(string) # e.g. buckets='{"a-us-prod1": "us-west-2", "a-eu-prod1":"eu-west-2"}'
}

resource "aws_s3_bucket" "my_buckets" {
    for_each = var.buckets

    bucket = each.key
    region = each.value
}

resource "aws_s3_bucket_policy" "my_buckets_policy" {
    for_each = aws_s3_bucket.my_buckets
    bucket = each.value.id
    policy = ...
}

Я пробовал использовать несколько провайдеров с псевдонимами , но вы не можете программно использовать поставщика на основе значения переменной, которую вы повторяете. Как правильно организовать этот проект и ресурсы для достижения sh этого?

Эти проблемы, с которыми я столкнулся, связаны с этим: https://github.com/hashicorp/terraform/issues/3656 https://github.com/terraform-providers/terraform-provider-aws/issues/5999

1 Ответ

2 голосов
/ 05 августа 2020

Атрибут region только что был удален из s3_bucket в terraform-provider- aws v3.0.0 с 31 июля 2020 года. До этого вы могли установить region для корзины, и это было бы соблюдено и сегмент был бы создан в этом выбранном регионе. Однако это было не то, как управляется любой другой ресурс, вероятно, это было просто потому, что S3 имеет глобальную область видимости, а у корзины нет области в arn. Все остальные службы используют регион самого поставщика (как и должно быть).

Я бы рекомендовал создать разных поставщиков для всех разных регионов, которые вы можете поддерживать, а затем разделить var.buckets в соответствии с свой регион, а затем создайте по одному resource "aws_s3_bucket" "this_region" { } для каждого региона:

variable "buckets" {
    type = map(string) # e.g. buckets='{"a-us-prod1": "us-west-2", "a-eu-prod1":"eu-west-2"}'
}

provider "aws" {
    region = "eu-west-2"
    alias  = "eu-west-2"
}

locals {
    eu_west_2_buckets = [for name, region in var.buckets: name if region == "eu-west-2"]
}

resource "aws_s3_bucket" "eu_west_2_buckets" {
    count   = length(local.eu_west_2_buckets)
    bucket  = eu_west_2_buckets[count.index]
    provider = aws.eu-west-2
}

Если вы хотите развернуть только сегменты, соответствующие текущему региону развертывания, вы можете сделать это, просто изменив журнал фильтрации сегментов. c:

variable "buckets" {
    type = map(string) # e.g. buckets='{"a-us-prod1": "us-west-2", "a-eu-prod1":"eu-west-2"}'
}

locals {
    buckets = [for name, region in var.buckets: name if region == data.aws_region.current.name]
}

data "aws_region" "current" { }

resource "aws_s3_bucket" "buckets" {
    count   = length(local.buckets)
    bucket  = buckets[count.index]
}
...