Terraform 从另一个项目导入 ECS 任务定义
Terraform import ECS task definition from another project
我有多个项目,每个项目都有自己的 Terraform 来管理特定于该项目的 AWS 基础设施。共享的基础架构(例如 VPC):我导入到需要它的项目中。
我想使用步骤函数将来自不同服务的许多不同任务粘合在一起,但其中一些是 Fargate ECS 任务。这意味着我需要在步骤函数中指定任务定义 ARN。
我可以导入任务定义,但如果我稍后更新管理该任务定义的项目,修订将更改,而步骤函数将继续指向旧的任务定义修订。
在这一点上,我还不如将任务 ARN 硬编码到步骤函数中,只需要记住在将来更新它。
有人知道解决这个问题的方法吗?
您可以使用 aws_ecs_task_definition
data source 查找任务定义系列的最新修订:
data "aws_ecs_task_definition" "example" {
task_definition = "example"
}
output "example" {
value = data.aws_ecs_task_definition.example
}
应用它会产生以下输出(假设您的 AWS 账户中有 example
服务):
example = {
"family" = "example"
"id" = "arn:aws:ecs:eu-west-1:1234567890:task-definition/example:333"
"network_mode" = "bridge"
"revision" = 333
"status" = "ACTIVE"
"task_definition" = "example"
"task_role_arn" = "arn:aws:iam::1234567890:role/example"
}
所以你可以这样做:
data "aws_ecs_task_definition" "example" {
task_definition = "example"
}
data "aws_ecs_cluster" "example" {
cluster_name = "example"
}
resource "aws_sfn_state_machine" "sfn_state_machine" {
name = "my-state-machine"
role_arn = aws_iam_role.iam_for_sfn.arn
definition = <<EOF
{
"StartAt": "Manage ECS task",
"States": {
"Manage ECS task": {
"Type": "Task",
"Resource": "arn:aws:states:::ecs:runTask.waitForTaskToken",
"Parameters": {
"LaunchType": "FARGATE",
"Cluster": ${data.aws_ecs_cluster.example.arn},
"TaskDefinition": ${data.aws_ecs_task_definition.example.id},
"Overrides": {
"ContainerOverrides": [
{
"Name": "example",
"Environment": [
{
"Name": "TASK_TOKEN_ENV_VARIABLE",
"Value.$": "$$.Task.Token"
}
]
}
]
}
},
"End": true
}
}
}
EOF
}
我有多个项目,每个项目都有自己的 Terraform 来管理特定于该项目的 AWS 基础设施。共享的基础架构(例如 VPC):我导入到需要它的项目中。
我想使用步骤函数将来自不同服务的许多不同任务粘合在一起,但其中一些是 Fargate ECS 任务。这意味着我需要在步骤函数中指定任务定义 ARN。
我可以导入任务定义,但如果我稍后更新管理该任务定义的项目,修订将更改,而步骤函数将继续指向旧的任务定义修订。
在这一点上,我还不如将任务 ARN 硬编码到步骤函数中,只需要记住在将来更新它。
有人知道解决这个问题的方法吗?
您可以使用 aws_ecs_task_definition
data source 查找任务定义系列的最新修订:
data "aws_ecs_task_definition" "example" {
task_definition = "example"
}
output "example" {
value = data.aws_ecs_task_definition.example
}
应用它会产生以下输出(假设您的 AWS 账户中有 example
服务):
example = {
"family" = "example"
"id" = "arn:aws:ecs:eu-west-1:1234567890:task-definition/example:333"
"network_mode" = "bridge"
"revision" = 333
"status" = "ACTIVE"
"task_definition" = "example"
"task_role_arn" = "arn:aws:iam::1234567890:role/example"
}
所以你可以这样做:
data "aws_ecs_task_definition" "example" {
task_definition = "example"
}
data "aws_ecs_cluster" "example" {
cluster_name = "example"
}
resource "aws_sfn_state_machine" "sfn_state_machine" {
name = "my-state-machine"
role_arn = aws_iam_role.iam_for_sfn.arn
definition = <<EOF
{
"StartAt": "Manage ECS task",
"States": {
"Manage ECS task": {
"Type": "Task",
"Resource": "arn:aws:states:::ecs:runTask.waitForTaskToken",
"Parameters": {
"LaunchType": "FARGATE",
"Cluster": ${data.aws_ecs_cluster.example.arn},
"TaskDefinition": ${data.aws_ecs_task_definition.example.id},
"Overrides": {
"ContainerOverrides": [
{
"Name": "example",
"Environment": [
{
"Name": "TASK_TOKEN_ENV_VARIABLE",
"Value.$": "$$.Task.Token"
}
]
}
]
}
},
"End": true
}
}
}
EOF
}