amazon-web-services - 向 ECS 服务添加标签 - InvalidParameterException
问题描述
我在 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 服务资源的片段以及任务定义:
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。
解决方案
既然你提到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 文档
推荐阅读
- java - 变量为空,尽管它已设置
- firebase - flutter firebase 数据库获取用户ID,然后获取其他数据
- json - 如何将数据保存在json文件中?
- c# - .NET Core C# - 在 Windows 10 中删除符号链接文件夹中的文件
- python - 如何在 Mac 的默认 python2.7 中使用来自 miniconda 的库?
- django - 无法使用 url 映射视图
- math - 朱莉娅提供了错误的数字结果
- typescript - 打字稿错误 TS2304:即使使用 esnext 也找不到名称 AsyncIterator
- android - Android-应用程序没有收到来自解析平台的推送通知
- c# - 生成和打印 Microsoft Word 文件