AWS CloudFormation嵌套栈部署REST API如何统一API Gateway访问地址
解决方案
步骤1:主模板导出共享API Gateway核心参数
主模板中仅保留1份API Gateway实例定义,完成后通过Outputs导出API ID、根资源ID、环境名称等核心参数,供所有子栈引用。
# 主模板 template.yaml 核心配置 Resources: # 全局唯一的共享API Gateway实例 SharedMainApi: Type: AWS::Serverless::Api Properties: StageName: prod Name: BusinessUnifiedApi Outputs: SharedMainApiId: Value: !Ref SharedMainApi Export: Name: !Sub ${AWS::StackName}-SharedMainApiId SharedMainApiRootResourceId: Value: !GetAtt SharedMainApi.RootResourceId Export: Name: !Sub ${AWS::StackName}-SharedMainApiRootResourceId
步骤2:子模板显式引用主栈API,禁用自动创建API
子模板中不要定义任何AWS::Serverless::Api或AWS::ApiGateway::RestApi类型资源,所有Lambda的API触发配置显式指定使用主栈传入的API实例。
# 业务子模板 template_user.yaml 核心配置 Parameters: SharedMainApiId: Type: String SharedMainApiRootResourceId: Type: String Resources: # 可选:按业务模块创建统一父路径,便于路径分组 UserModuleRootPath: Type: AWS::ApiGateway::Resource Properties: RestApiId: !Ref SharedMainApiId ParentId: !Ref SharedMainApiRootResourceId PathPart: user # 示例业务Lambda函数 GetUserInfoFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/get_user_info/ Handler: app.lambda_handler Runtime: python3.9 Events: GetUserInfo: Type: Api Properties: Path: /user/info Method: get # 关键配置:指定使用主栈的共享API Gateway RestApiId: !Ref SharedMainApiId
步骤3:主模板嵌套栈声明时传入API参数
主模板中定义嵌套栈时,把共享API的核心参数传递给子栈,完成资源关联。
# 主模板 template.yaml 嵌套栈配置 Resources: # 前面的SharedMainApi配置保持不变 UserBusinessNestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./template_user.yaml Parameters: SharedMainApiId: !Ref SharedMainApi SharedMainApiRootResourceId: !GetAtt SharedMainApi.RootResourceId
步骤4:统一执行部署
删除之前生成的独立API Gateway残留资源后,重新通过SAM部署主栈即可,所有子栈的API端点都会挂载到主栈的API Gateway实例上,仅生成1个访问地址。
注意:如果需要自定义部署逻辑,仅需要在主栈中定义API Deployment资源即可,不需要在子栈单独部署API实例。
内容的提问来源于stack exchange,提问作者PeakGen
相关产品推荐
相关产品推荐

