【问题标题】:AWS Service Connect With TerraformAWS 服务与 Terraform 连接
【发布时间】:2023-02-23 01:52:59
【问题描述】:

寻找工作 terraform 计划来配置 AWS Service Connect With ECS (FARGATE)。

这就是我所拥有的:

resource "aws_service_discovery_http_namespace" "my-cloudmap-namespace" {
  name        = "<namespace>"
  description = "Namespace for Service Discovery"
}

容器定义:

[
    {
        "name": "my-service-container",
        "image": "XXXXXXXXXXX",
        "cpu": 0,
        "essential": true,
        "portMappings": [{
            "name": "my-service",
            "containerPort": 4002,
            "hostPort": 4002,
            "protocol": "tcp",
            "appProtocol": "http"
        }]
    }
]

然后在服务定义中:

service_connect_configuration {
    enabled = true
    namespace = aws_service_discovery_http_namespace.my-cloudmap-namespace.arn
    service {
      client_alias {
        dns_name = "my-service"
        port = "4002"
      }
      discovery_name = "my-service"
      port_name = "my-service"
    }
}

这似乎不起作用。我无法从另一个实例访问 http://my-service:4002/ 上的服务。

是否有人使用 terraform 成功配置了 Service Connect with ECS (FARGATE)?

【问题讨论】:

  • 我现在遇到了同样的问题,我正在与 AWS 合作寻找解决方案。我的预感是您的发现服务被注册为“http”而不是 DNS 方法。所以你不能只使用 dns 名称“我的服务”,你必须调用发现 API 来获取可用服务和 ips 的列表。如果我得到一个好的答案,我会回来提交它。
  • 如果有帮助,我可以通过在创建服务时更改“计算机选项”来解决问题。如果您选择“容量提供者策略”而不是“启动类型”,它会按预期工作。
  • 还要确保与该服务关联的安全组本身具有访问权限。

标签: amazon-web-services terraform amazon-ecs aws-fargate


【解决方案1】:

您应该检查您是否具有执行代理 API 调用的角色。如果您的工作不重要,您还应该尝试使用一个安全组来允许一切都在开始时进行,因此您要确保在这一侧没有任何锁定。然后你可以根据需要定义你的安全组(因为安全组可以阻止代理部分)。

您应该像这样创建任务和服务:

# Your task definition.
resource "aws_ecs_task_definition" "your_task" {
  family                   = "your_service_family"
  cpu                      = 512
  memory                   = 1024
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
  task_role_arn            = aws_iam_role.ecs_instance_role.arn
  container_definitions = jsonencode([{
    name      = "your_name"
    image     = "your_image"
    cpu       = 1
    memory    = 1024
    essential = true
    portMappings = [{ containerPort = 8000, hostPort = 8000, name = "my-port" }]
  }])
}

# And your service.
resource "aws_ecs_service" "your_service" {
  cluster         = your_cluster.arn
  name            = "your_service_name"
  desired_count   = 1
  launch_type     = "FARGATE"
  task_definition = aws_ecs_task_definition.your_task.arn
  ...
  service_connect_configuration {
    enabled   = true
    namespace = aws_service_discovery_http_namespace.service_discovery.arn
    service {
      discovery_name = "service"
      port_name      = "my-port"
      client_alias {
        dns_name = "your-dns"
        port     = 8000
      }
    }
  }
}

小心有角色:

# Default ECS Task Execution policy defined directly by AWS.
data "aws_iam_policy" "amazon_ecs_task_execution_role_policy" {
  name = "AmazonECSTaskExecutionRolePolicy"
}

# Default ECS Task Instance policy defined directly by AWS.
data "aws_iam_policy" "amazon_ec2_container_service_for_ec2_role" {
  name = "AmazonEC2ContainerServiceforEC2Role"
}

data "aws_iam_policy_document" "ecs_assume_role" {
  statement {
    actions = ["sts:AssumeRole"]
    sid     = ""
    effect  = "Allow"
    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com", "ecs-tasks.amazonaws.com"]
    }
  }
}

data "aws_iam_policy_document" "ecs_tasks_secrets_policy" {
  statement {
    resources = ["*"]
    effect    = "Allow"
    actions = [
      "kms:Decrypt",
      "ssm:GetParameters",
      "secretsmanager:GetSecretValue"
    ]
  }
}

resource "aws_iam_policy" "ecs_tasks_secrets" {
  name        = "ecsTasksSecrets"
  description = "Access Secrets in ECS Tasks"
  policy      = data.aws_iam_policy_document.ecs_tasks_secrets_policy.json
}

resource "aws_iam_role" "ecs_task_execution_role" {
  name = "ecsTaskExecutionRole"
  managed_policy_arns = [
    data.aws_iam_policy.amazon_ecs_task_execution_role_policy.arn,
    aws_iam_policy.ecs_tasks_secrets.arn,
  ]
  assume_role_policy = data.aws_iam_policy_document.ecs_assume_role.json
}

resource "aws_iam_role" "ecs_instance_role" {
  name                = "ecsInstanceRole"
  managed_policy_arns = [data.aws_iam_policy.amazon_ec2_container_service_for_ec2_role.arn]
  assume_role_policy  = data.aws_iam_policy_document.ecs_assume_role.json
}

注意在您的任务中使用task_role_arn,否则代理无法将您的 API 调用转换为 IP。

Some AWS Docs for the Container Instance role. Some AWS Docs for Service Connect. Some AWS Docs for Task Execution role.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2023-01-08
    • 2020-10-16
    • 2019-06-15
    • 2020-01-02
    • 2017-02-26
    • 2022-06-16
    相关资源
    最近更新 更多