【问题标题】:Get TargetGroupArn from name?从名称中获取 TargetGroupArn?
【发布时间】:2018-12-16 02:50:10
【问题描述】:

您在 ECS 服务的 CF 模板中使用 TargetGroupArn。我有一种情况,目标组已经创建,我想将其作为模板的参数

但是那些arn很糟糕:

arn:aws:elasticloadbalancing:us-east-1:123456:targetgroup/mytarget/4ed48ba353064a79

最后那个唯一的数字使这几乎是不可能的。我可以在模板中按名称而不是完整的 arn 来引用目标吗?

也许我可以在这里使用 Fn::GetAtt 但不确定它是什么样子

这不起作用:

  • TargetGroupArn: !GetAtt mytarget.TargetGroupName

我收到错误:An error occurred (ValidationError) when calling the CreateChangeSet operation: Template error: instance of Fn::GetAtt references undefined resource mytarget

【问题讨论】:

    标签: amazon-cloudformation amazon-ecs


    【解决方案1】:
    1. 如果要使用可用的目标组,请将目标组名称作为默认参数传递给服务 CF 模板。
    2. 在内部将默认参数作为引用引用到 LiestnerRule 的 Action 部分中的 TargetGroupArn 它将获取目标组 ARN。
    3. 查看此链接:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html
    {
      "Parameters": {
          "VPC": {
          ...
          "TargetGroup": {
              "Description": "TargetGroup name for ListenerRule",
              "Type": "String",
              "Default": "my-target"
          }
      },
      "Resources": {
          "Service": {
          "TaskDefinition": {
          ....
          "ListenerRule": {
                      ....
                  "Actions": [
                      {
                          "TargetGroupArn": {
                              "Ref": "TargetGroup"
                          },
                          "Type": "forward"
                      }
                  ]
              }
          },
          "ServiceRole": {
      }
    }
    

    【讨论】:

    • 这给了我这个错误:Unable to assume role and validate the specified targetGroupArn. Please verify that the ECS service role being passed has the proper permissions. 那是在使用 ECS 服务的默认“ecsServiceRole”时。我还尝试将 ReadOnly 然后 AdministratorAccess 帐户范围的策略添加到此角色,但仍然收到相同的错误。
    • 我也没有在模板中定义 listenerRule,只是指向“LoadBalancers”下的 targetGroupArn。
    • Listener Rule 是指向你定义的 ALB。在其中,您将能够指向目标组。您应该为服务定义默认角色。请参考此链接以获取服务角色:docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
    【解决方案2】:

    不幸的是,对于目标组,由于末尾有多余的字符串,您将无法使用约定来确定它的 ARN。

    如果目标组是在 Cloudformation 中创建的,则使用 !Ref myTargetGroup 很容易获得 ARN output

    如果目标组是在另一个 CF 堆栈中创建的,请尝试Exporting 目标组 ARN,并在创建 ECS 服务时使用Fn::ImportValue 输入目标组 ARN。

    Type: "AWS::ECS::Service"
    Properties: 
      ...
      LoadBalancers:
        - ContainerName: MyContainer
          ContainerPort: 1234
          TargetGroupArn: !ImportValue myExportedTargetGroupARN
      ...
    

    【讨论】:

    • 目标组不是用 cf 创建的
    • 在这种情况下,您需要像 Sunil V 建议的那样将目标组 ARN 作为参数传递
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2012-08-29
    • 2011-04-03
    • 2013-11-06
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多