AWS CloudFormation报错:PathPart为只读属性,如何获取该值?
解决方案:复用PathPart值而非硬编码
问题核心在于:AWS::ApiGateway::Resource的PathPart是用户传入的可配置属性,并非CloudFormation生成的只读输出属性,所以!GetAtt无法获取它;而!Ref返回的是该资源的唯一ID(不是路径片段),自然没法用来拼接正确的SourceArn。
不用硬编码的解决办法是复用同一个变量值,具体可以这么做:
- 在模板里定义一个参数(或直接用自定义变量)存储PathPart的值
- 在
AWS::ApiGateway::Resource的PathPart属性里引用这个变量 - 在
AWS::Lambda::Permission的SourceArn里通过!Sub引用同一个变量
示例代码(YAML格式):
Parameters: ApiResourcePath: Type: String Default: helloworld # 这里只需要定义一次 Resources: # 定义API Gateway资源 MyApiResource: Type: AWS::ApiGateway::Resource Properties: ParentId: !Ref MyApiRoot PathPart: !Ref ApiResourcePath RestApiId: !Ref MyRestApi # 配置Lambda调用权限 LambdaInvokePermission: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction FunctionName: !Ref MyLambdaFunc Principal: apigateway.amazonaws.com SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${MyRestApi}/*/*/${ApiResourcePath}"
这样一来,后续要修改路径片段时,只需要修改Parameters里的默认值(或者部署时传入参数),不用在多个地方改硬编码的字符串,维护起来更方便。
内容的提问来源于stack exchange,提问作者MatteoT
相关产品推荐
相关产品推荐

