使用 FindInMap 进行多层引用时,堆栈创建会出错

Stack creation gives error with Multiple layers reference with FindInMap

我的 lambda 函数有多个层。当我尝试创建云形成堆栈时出现以下错误。

#/Layers/0: expected type: String, found: JSONObject #/Layers/1: expected type: String, found: JSONObject

我的云形成模板如下所示

Mappings:
 LayersInfo:
    dev:
      mylayer: 
        -  !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:my-utils:1"
        -  !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:my-db-layer:10"

MyLambda:
    Type: AWS::Lambda::Function
    DependsOn: LambdaPolicy
    Properties:
      Description: xxxxx
      FunctionName: mylambda
      Handler: index.lambda_handler
      Layers: !FindInMap [LayersInfo, !Ref Region, mylayer]

似乎无法将列表转换为字符串。

您不能在 Mappings 中使用 Sub。映射中的值必须是显式字符串或列表。所以你必须在你的图层中硬编码 AWS::RegionAWS::AccountId

替代方法是创建您自己的 macro 以替换区域和帐户 ID 的实际值。

这是可行的解决方案

Mappings:
 LayersInfo:
  dev:
    mylayer1: "my-utils:1"
    mylayer2: "my-db-layer:10"

MyLambda:
 Type: AWS::Lambda::Function
 DependsOn: LambdaPolicy
 Properties:
  Description: xxxxx
  FunctionName: mylambda
  Handler: index.lambda_handler
  Layers: 
     -!Sub
      - arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:${Layer1}
      - Layer1: FindInMap [LayersInfo, !Ref Region, mylayer1]
     -!Sub
      - arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:${Layer2}
      - Layer2: FindInMap [LayersInfo, !Ref Region, mylayer2]