【问题标题】:Adding tags to ECS Service - InvalidParameterException向 ECS 服务添加标签 - InvalidParameterException
【发布时间】:2019-05-05 09:54:36
【问题描述】:

我在 AWS 中启动并运行了一个功能齐全的 Fargate 应用程序。我回去为我的所有资源添加标签,以更好地监控微服务架构中的成本。将标签添加到我的 aws_ecs_service 资源后,运行terraform apply 时出现以下异常:

aws_ecs_service.main: error tagging ECS Cluster (arn:aws:ecs:*region*:*account_number*:service/*service_name*): InvalidParameterException: Long arn format must be used for tagging operations

经过一番研究,我发现在 11 月 15 日,AWS 引入了新的 ARN 和 ID 格式:https://aws.amazon.com/ecs/faqs/#Transition_to_new_ARN_and_ID_format

我知道我需要将设置应用到已分配给我的服务的 IAM 角色,但我不知道如何操作。以下是账户设置的 AWS 文档链接:https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_Setting.html

下面是ecs服务资源的sn-p以及任务定义:

resource "aws_ecs_task_definition" "app" {
  family                   = "${var.app_name}"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "${var.app_cpu}"
  memory                   = "${var.app_memory}"
  execution_role_arn       = "${var.execution_role_arn}"
  task_role_arn            = "${var.task_role_arn}"

  tags {
    Name        = "${var.app_name}-ecs-task-definition-${var.environment}"
    Service     = "${var.app_name}"
    Environment = "${var.environment}"
    Cost_Center = "${var.tag_cost_center}"
    Cost_Code   = "${var.tag_cost_code}"
  }

  container_definitions = <<DEFINITION
[
  {
    "cpu": ${var.app_cpu},
    "image": "${var.app_image}",
    "memory": ${var.app_memory},
    "name": "${var.app_name}",
    "networkMode": "awsvpc",
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "stash-${var.app_name}",
        "awslogs-region": "${var.aws_region}",
        "awslogs-stream-prefix": "${var.app_name}"
      }
    },
    "portMappings": [
      {
        "containerPort": ${var.app_port},
        "hostPort": ${var.app_port}
      }
    ]
  }
]
DEFINITION
}

resource "aws_ecs_service" "main" {
  name            = "${var.app_name}-service"
  cluster         = "${var.cluster_id}"
  task_definition = "${aws_ecs_task_definition.app.arn}"
  desired_count   = "1"
  launch_type     = "FARGATE"

  network_configuration {
    security_groups = ["${var.security_groups}"]
    subnets         = ["${var.subnets}"]
  }

  load_balancer {
    target_group_arn = "${var.target_group_arn}"
    container_name   = "${var.app_name}"
    container_port   = "${var.app_port}"
  }

  lifecycle {
    ignore_changes = ["desired_count"]
  }

  tags {
    Name        = "${var.app_name}-ecs-service-${var.environment}"
    Service     = "${var.app_name}"
    Environment = "${var.environment}"
    Cost_Center = "${var.tag_cost_center}"
    Cost_Code   = "${var.tag_cost_code}"
  }
}

以下是我的安全资源:

resource "aws_iam_role" "task_role" {
  name = "${var.app_name}-task-${var.environment}"

  assume_role_policy = <<END
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
END
}

我使用的是 terraform 版本 0.11.8。

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    既然你提到了terraform,让我补充一下(我也在使用 terraform 并遇到了一个非常相似的问题)。您可以使用 AWS CLI,配合 ECS 子命令 put-account-setting 设置三个 LongArnFormat

    aws ecs put-account-setting --name containerInstanceLongArnFormat --value enabled --region _yourRegion_
    aws ecs put-account-setting --name serviceLongArnFormat           --value enabled --region _yourRegion_
    aws ecs put-account-setting --name taskLongArnFormat              --value enabled --region _yourRegion_
    

    参考:AWS Doc

    【讨论】:

    • 在相关说明中:如果您在尝试执行这些操作时收到 aws: error: argument operation: Invalid choice,请升级您的 awscli
    【解决方案2】:

    根据新 ARN 格式的 online documentation for opting in,您需要具有 Root 帐户访问权限才能选择加入特定 IAM 角色。

    上面链接状态中详述的步骤你应该

    • 为您的集群创建一个 IAM 角色(您已完成此操作)
    • 以 root 身份登录
    • 前往opt in page 并选择要加入的 IAM 角色
    • 希望获利!

    请注意,在 2020 年 1 月之前,您还可以选择加入整个帐户,届时此更改将成为强制性的。

    【讨论】:

    • 嘿詹姆斯,我明白你的意思。但是这里的问题陈述是针对基于 Fargate 的 ECS,而不是基于 EC2 的 ECS 服务。这个过程对那些也有效吗?
    • @nitin194 我相信该流程适用于所有 ECS 类型,但如果我正确理解 AWS 时间线,新的 ID 格式现在应该被 AWS 普遍应用于所有账户。根据问题中指定的链接,“到 2019 年 12 月,新的 ARN/ID 将可通过 API 和 ECS 控制台选择加入。所有帐户都可以根据需要选择加入和退出以进行测试。开始于2020 年 1 月 1 日起,格式切换选项将不再可用,新创建的 ECS 资源将全部接收新的 ARN 和 ID 格式。”
    猜你喜欢
    • 2018-06-27
    • 2021-09-08
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多