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
}