使用 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::Region
和 AWS::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]
我的 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::Region
和 AWS::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]