Terraform: Какой смысл использовать источник данных и ресурс для одного типа? - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в Terraform, и я работаю над проектом по использованию инфраструктуры Docker / AWS ECR / ECS в AWS.Я вижу в этом посте , где автор указывает что-то вроде

data "aws_ecs_task_definition" "test" {
 task_definition = "${aws_ecs_task_definition.test.family}"
 depends_on = ["aws_ecs_task_definition.test"]
}

resource "aws_ecs_task_definition" "test" {
 family = "test-family"
 # ...
}

, почему он использует источник данных И ресурс на aws_ecs_task_definition?Я не могу найти объяснения или подобного примера после нескольких часов копания в официальном документе, а также в поиске статей.

Я вижу позже, когда он настраивает службу, он использует следующий код для ссылки на них обоих: (опять же, я не уверен, что здесь происходит)

task_definition = "${aws_ecs_task_definition.test.family}:${max("${aws_ecs_task_definition.test.revision}", "${data.aws_ecs_task_definition.test.revision}")}"

Теперь меня смущает, в чем разница между использованием данных и ресурсов в одном типе по сравнению с использованием ресурсов.Есть ли разница в жизненном цикле?

Сейчас я пытаюсь создать AWS ECR для своего образа докера, и я хочу, чтобы terraform управлял им (создавал / обновлял / уничтожал), должен ли я использовать источник данных и ресурс для типа aws_ecr_repository какхорошо?

1 Ответ

0 голосов
/ 21 февраля 2019

Это имеет смысл.Парень использует источник данных, чтобы получить последнюю версию определения задачи.Это потому, что он может использовать какой-то другой инструмент (jenkins / circleci) для внесения изменений в определение или ревизию задачи.

Следовательно, если он снова запустит этот код, то terraform должен выбрать последнюю версию и соответствующим образом обновить службу ecs.

Проверьте следующий код:

resource "aws_ecs_service" "test-ecs-service" {
 name = "test-vz-service"
 cluster = "${aws_ecs_cluster.test-ecs-cluster.id}"
 task_definition = "${aws_ecs_task_definition.test.family}:${max("${aws_ecs_task_definition.test.revision}", "${data.aws_ecs_task_definition.test.revision}")}"
 desired_count = 1
 iam_role = "${aws_iam_role.ecs-service-role.name}"

load_balancer {
 target_group_arn = "${aws_alb_target_group.test.id}"
 container_name = "nginx"
 container_port = "80"
 }

Он обновляет сервис с последней версией.Он использует функцию MAX, которая возвращает максимальное значение.Вы можете проверить синтаксис интерполяции terraform, здесь .

, если определение задачи не существует, будет ли этот сценарий terraform создавать его?

Да,Он создаст его в соответствии с определением задачи, которое содержится в файле состояния.Если вы создали определение задачи вручную, он будет увеличивать номер редакции.

, если определение задачи существует и блок источника данных его получил, будет ли блок ресурсов повторно создавать другое пересмотренное определение задачи, или будетон просто ничего не делает?

Если есть изменения в любой конфигурации ресурса, то он создаст новое определение задачи, и это определение задачи будет выделено для ресурса службы ecs, но если нетизменение ресурса тогда ничего не даст.

Мне также неясно, предназначен ли этот скрипт terraform для запуска только один раз (первоначальное создание инфраструктуры) или при изменении?

Это должно быть выполнено во время создания инфраструктуры или если вы хотите выполнить любое другое обновление ресурса определения задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...