我有多个项目,每个项目都有自己的 Terraform 来管理特定于该项目的 AWS 基础设施。共享的基础设施(例如 VPC(:我导入到需要它的项目中。
我想使用步骤函数将来自不同服务的许多不同的任务粘合在一起,但其中一些是 Fargate ECS 任务。这意味着我需要在步骤函数中指定任务定义 ARN。
我可以导入任务定义,但是如果我稍后更新管理该任务定义的项目,修订版将更改,而步骤函数将继续指向旧的任务定义修订版。
此时,我不妨将任务 ARN 硬编码到 step 函数中,并且只需要记住将来更新它。
有人知道解决这个问题的方法吗?
可以使用aws_ecs_task_definition
数据源查找任务定义系列的最新版本:
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
}