Terraform - использование параметров SSM в определении контейнера ECS - PullRequest
1 голос
/ 03 августа 2020

Я использую Terraform для развертывания задачи ECS и хотел бы использовать AWS Параметры SSM в определении контейнера задачи ECS.

У меня есть 3 параметра SSM, которые я хотел бы использовать для переопределения свойства по умолчанию, определенные в service. json. (PORT, TEST_PROP_1, TEST_PROP_2)

Есть ли у меня способ предоставить ARN этих параметров SSM для переменных среды определения контейнера?

Ресурс Terraform:

resource "aws_ecs_task_definition" "testapp" {
  family                = "testapp"
  network_mode = "awsvpc"
  cpu = 256
  memory = 512
  container_definitions = file("../modules/ecs_service/task-definitions/service.json")
  requires_compatibilities = [
    "FARGATE"
  ]
  execution_role_arn = "arn:aws:iam::redacted:role/ecsTaskExecutionRole"
  task_role_arn = "arn:aws:iam::redacted:role/ecsTaskExecutionRole"
}

сервис. json

[
    {
        "name": "testapp",
        "image": "redacted/demoapp:latest",
        "portMappings": [
            {
                "containerPort": 59817,
                "hostPort": 59817,
                "protocol": "tcp"
            }
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "testappLG",
                "awslogs-region": "us-east-1",
                "awslogs-stream-prefix": "devtest"
            }
        },
        "Environment": [
            {
                "Name": "PORT",
                "Value": "9001"
            },
            {
                "Name": "TEST_PROP_1",
                "Value": "Override value - test prop 1"
            },
            {
                "Name": "TEST_PROP_2",
                "Value": "Override value - test prop 2"
            }
        ]
    }
]

1 Ответ

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

Вы можете создать параметр SSM в этом прогоне Terraform, и в этом случае у вас уже будет ссылка на него, или вы можете найти его, используя источник данных . В качестве примера предположим, что вы используете источник данных:

data "aws_ssm_parameter" "foo" {
  name = "foo"
}

Теперь вместо функции file() я бы использовал функцию templatefile(), поэтому вы можете использовать интерполяцию внутри json. Это означает, что строка в вашем шаблоне Terraform изменится на это (передавая ARN секрета, который вы хотите использовать в JSON):

container_definitions = templatefile( "../modules/ecs_service/task-definitions/service.json", { 
    secret1 = data.aws_ssm_parameter.foo.arn 
})

Наконец, ваш JSON файл должен выглядеть как это для того, чтобы сообщить ECS найти секрет и передать его в контейнер при создании экземпляра вашей задачи:

[
    {
        "name": "testapp",
        "image": "redacted/demoapp:latest",
        "portMappings": [
            {
                "containerPort": 59817,
                "hostPort": 59817,
                "protocol": "tcp"
            }
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "testappLG",
                "awslogs-region": "us-east-1",
                "awslogs-stream-prefix": "devtest"
            }
        },
        "secrets": [
            {
                "name": "MY_SECRET",
                "valueFrom": "${secret1}"
            }
        ],
        "Environment": [
            {
                "Name": "PORT",
                "Value": "9001"
            },
            {
                "Name": "TEST_PROP_1",
                "Value": "Override value - test prop 1"
            },
            {
                "Name": "TEST_PROP_2",
                "Value": "Override value - test prop 2"
            }
        ]
    }
]
...