TL;DR: Нужно ли моему экземпляру EC2 добавить роль IAM в мой кластер ECS? Если да, то как мне это установить?
У меня есть экземпляр EC2, созданный с использованием группы автоматического масштабирования. (Определение ПГС здесь.) У меня также есть кластер ECS, который устанавливается на порожденных инстансах через user_data
. Я подтвердил, что /etc/ecs/ecs.config
на работающем экземпляре выглядит правильно:
ECS_CLUSTER=my_cluster
Однако экземпляр никогда не появляется в кластере, поэтому задача службы не запускается. На SO есть множество вопросов по этому поводу, и я прошел через них все. Экземпляры находятся в общедоступной подсети и имеют доступ к Интернету. Ошибка в ecs-agent.log
:
Error getting ECS instance credentials from default chain: NoCredentialProviders: no valid providers in chain.
Итак, я предполагаю, что проблема в том, что с ним связан экземпляр не имеет роли IAM. Но я признаюсь, что я немного запутался во всех задействованных «ролях» и «услугах». Это похоже на проблему?
Если это так, где я могу установить это? Я использую модули Cloud Posse. Документы говорят Мне не следует устанавливать service_role_arn
для сервисной задачи, если я использую «awsvpc» в качестве сетевого режима, но я не уверен, следует ли мне использовать другой режим для этой настройки (несколько контейнеров, работающих как задачи на одном экземпляр EC2). Кроме того, есть несколько других ролей, которые я могу настроить здесь? Задача службы ECS выглядит следующим образом:
module "ecs_alb_service_task" {
source = "cloudposse/ecs-alb-service-task/aws"
# Cloud Posse recommends pinning every module to a specific version
version = "0.62.0"
container_definition_json = jsonencode([for k, def in module.flask_container_def : def.json_map_object])
name = "myapp-web"
security_group_ids = [module.sg.id]
ecs_cluster_arn = aws_ecs_cluster.default.arn
task_exec_role_arn = [aws_iam_role.ec2_task_execution_role.arn]
launch_type = "EC2"
alb_security_group = module.sg.name
vpc_id = module.vpc.vpc_id
subnet_ids = module.subnets.public_subnet_ids
network_mode = "awsvpc"
desired_count = 1
task_memory = (512 * 3)
task_cpu = 1024
deployment_controller_type = "ECS"
enable_all_egress_rule = false
health_check_grace_period_seconds = 10
deployment_minimum_healthy_percent = 50
deployment_maximum_percent = 200
ecs_load_balancers = [{
container_name = "web"
container_port = 80
elb_name = null
target_group_arn = module.alb.default_target_group_arn
}]
}
А вот и правила для ec2_task_execution_role
:
data "aws_iam_policy_document" "ec2_task_execution_role" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ecs-tasks.amazonaws.com"]
}
}
}
Обновлять: Вот остальная часть объявления роли выполнения задачи:
resource "aws_iam_role" "ec2_task_execution_role" {
name = "${var.project_name}_ec2_task_execution_role"
assume_role_policy = data.aws_iam_policy_document.ec2_task_execution_role.json
tags = {
Name = "${var.project_name}_ec2_task_execution_role"
Project = var.project_name
}
}
resource "aws_iam_role_policy_attachment" "ec2_task_execution_role" {
role = aws_iam_role.ec2_task_execution_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}
# Create a policy for the EC2 role to use Session Manager
resource "aws_iam_role_policy" "ec2_role_policy" {
name = "${var.project_name}_ec2_role_policy"
role = aws_iam_role.ec2_task_execution_role.id
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [
"ssm:DescribeParameters",
"ssm:GetParametersByPath",
"ssm:GetParameters",
"ssm:GetParameter"
],
"Resource" : "*"
}
]
})
}
Обновление 2: Экземпляры EC2 создаются группой автоматического масштабирования, см. здесь мой код. Кластер ECS таков:
# Create the ECS cluster
resource "aws_ecs_cluster" "default" {
name = "${var.project_name}_cluster"
tags = {
Name = "${var.project_name}_cluster"
Project = var.project_name
}
}
Я ожидал, что в модуле ec2-автомасштабируемая группа будет что-то вроде instance_role
, но его нет.
Задача task_role_arn — не место для назначения роли экземпляра EC2. Это будет роль для задачи ECS (контейнер Docker). Весь код, который вы включили в свой вопрос, связан со службой ECS и задачей ECS, что будет иметь значение гораздо позже в процессе. Вам нужно показать, как создается кластер ECS и экземпляр EC2.
Спасибо @MarkB, я добавил больше кода.
Вам необходимо установить профиль экземпляра EC2 (роль экземпляра IAM) с помощью параметра iam_instance_profile_name
в файле module "autoscale_group"
.
Спасибо Спасибо! Мне нужно было создать роль, использующую управляемую политику AmazonEC2ContainerServiceforEC2Role
, и использовать эту роль для создания профиля экземпляра. Затем я установил этот профиль, как описано в autoscale_group
, и вуаля!
Спасибо за комментарий! Вы знаете, как это сделать? На самом деле я вижу очень похожую роль, созданную внутри модуля. Я создаю его, чтобы разрешить задачам EC2 доступ к SSM. (Я обновил вопрос.)