Динамически добавлять поведение источника / кэша в существующий дистрибутив CloudFront - PullRequest
0 голосов
/ 12 марта 2019

Мне кажется, что я столкнулся с ограничением в модуле AWS api или aws_cloudfront_distribution (версия v0.11).Я пытаюсь добиться динамического добавления источников и поведения кэша к существующему дистрибутиву CloudFront.

Я знаю, что это возможно с помощью AWS CLI .Пример этого показан ниже (взято из документации по распространению обновлений . Мой вопрос касается того, как я могу упростить эту реализацию с помощью terraform (показано под фрагментом кода).

$ JSON_OUTPUT=$(aws cloudfront get-distribution-config --id=<MY-DISTROS-ID>)
$ echo $JSON_OUTPUT
{
  "ETag": "E2ABCDEFGHIJKL",
  "DistributionConfig": {
    "CacheBehaviors": {
      "Quantity": 0
    },
    "Origins": {
      "Items": [
        {
          ...origin-info-for-default-cache-behavior
        }
      ],
      "Quantity": 1
    },
    "Enabled": true,
    "DefaultCacheBehavior": {
      ...default-cache-behavior
    },
    ...more-cloudfront-stuff
}
$ # remove the ETag
$ # add an entry to the DistributionConfig.Origins.Items array
$ # add an array of Items to the DistributionConfig.CacheBehaviors.Items = [{ the cache behavior }] and set Quantity = 1
$ # save DistributionConfig key value to a file file:///tmp/new-distro-config.json
$ aws cloudfront update-distribution --id <MY-DISTROS-ID> --distribution-config file:///tmp/new-distro-config.json --if-match E2ABCDEFGHIJKL

Это успешно добавит новое поведение кеша и источник к существующему дистрибутиву CloudFront.

Я хотел бы достичь этой же конечной цели, используя terraform, чтобы я мог сохранять состояние в S3. Так, например, используя terraform, Я бы

  • Создание дистрибутива облачного фронта
  • Из другого модуля terraform
    • Импорт дистрибутива облачного фронта с использованием блока данных
    • Добавление одногоповедение и происхождение отключенного кэша

В псевдокоде-терраформе, и для большей ясности, блок кода ниже иллюстрирует это далее

# original CloudFront distro
resource "aws_cloudfront_distribution" "my-distro" {
  aliases = ["${var.my_alias_domain}"]

  origin {
    ...origin-info-for-default-cache-behavior
  }

  enabled = true

  default_cache_behavior {
    ...default-cache-behavior
  }

  ...more-cloudfront-stuff

}

Затем в другоммодуль terraform (а иногда и в будущем), что-то вроде

data "terraform_remote_state" "CloudFront" {
  backend = "s3"

  config {
    acl    = "bucket-owner-full-control"
    bucket = "${var.CloudFront_BUCKET}"
    key    = "${var.CloudFront_KEY}"
    region = "${var.CloudFront_REGION}"
  }
}

resource "aws_cloudfront_distribution_origin" "next-origin" {
  cloudfront_distribution_id = "${data.terraform_remote_state.CloudFront.id}"

  origin {
    ...origin-info-for-default-cache-behavior
  }

  ordered_cache_behavior {
    ...origin-info-for-cache-behavior
  }
}

Я хорошо знаю, что aws_cloudfront_distribution_origin не является ресурсом в terraform.Я просто пишу этот псевдокод, чтобы передать то, что я пытаюсь достичь.Это практический вариант использования для того, чтобы разделить службу, которая должна все жить в одном домене.

После того, как все это написано, я предполагаю, что я должен просто отказаться от terraform в этом сценарии вместоCLI AWS напрямую.Однако, если кто-то еще достигнет этого, используя терраформ, я бы хотел услышать, как это возможно.

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Ответ заключается в том, что это невозможно с terraform v0.11 (насколько я могу судить, все еще открыт для предложений в противном случае).Я попытался динамически увеличить аргументы origin / ordered_cache_behavior, установив атрибут count.Что-то вроде следующего

variable "s3_buckets_info" {
  type        = "list"
  description = "S3 buckets information"
  default = [{
    domain_name = "this.is.a.domain.com"
    app = "this.is.the.app"
    env = "this.is.the.env"
    path = "/match/this/path"
  }, {
    domain_name = "that.is.a.domain.com"
    app = "that.is.the.app"
    env = "that.is.the.env"
    path = "/match/that/path"
  }]
}

resource "aws_cloudfront_distribution" "eb_app" {
  aliases = ["${var.docs_alias_domain}"]

  origin {
    count       = "${length(var.s3_buckets_info)}"

    domain_name = "${lookup(var.s3_buckets_info[count.index + 1], "domain_name")}"
    origin_id   = "${lookup(var.s3_buckets_info[count.index + 1], "app")}-${lookup(var.s3_buckets_info[count.index + 1], "env")}"
    origin_path = ""

Затем я столкнулся с вопросом, что origin[0].count не является принятым аргументом.После дополнительного поиска в Google я обнаружил следующие проблемы с GH:

Это привело меня к обескураживающему осознанию того, что для использования такого типа поведения нужны для и для каждого функции, которые доступны (в настоящий момент) только в v0.12.0-бета1 , которые они не рекомендуют использовать в производстве, потому что, ну, это бета-версия:

Terraform 0.12 еще не выпущена.Это руководство включает в себя некоторую начальную информацию, которая поможет при испытании бета-версий Terraform v0.12.0, и будет обновляться с более подробной информацией до окончательного выпуска.Пожалуйста, не используйте предварительные версии v0.12.0 для производственной инфраструктуры.

0 голосов
/ 11 июня 2019

Я пошел дальше и попробовал это в версии terraform 12. Открыта для обратной связи!

https://github.com/jmgreg31/terraform_aws_cloudfront

...