能否将API Gateway作为CloudFormation API代理,无需Lambda中转执行栈操作?
当然可以!你完全不需要借助Lambda中间层,就能把API Gateway配置成CloudFormation API的代理,直接转发CreateStack、UpdateStack这类带JSON请求体的POST/PUT命令。下面是关键的配置要点和注意事项:
选择正确的集成类型
在API Gateway里创建方法时,要选择AWS Service作为集成类型,而不是HTTP或Lambda。接着指定服务为CloudFormation,选择你要操作的AWS区域,然后匹配CloudFormation API的具体路径和HTTP方法。比如:- 创建栈(CreateStack)对应POST请求,集成路径是
/2010-05-15/stacks - 更新栈(UpdateStack)对应PUT请求,集成路径是
/2010-05-15/stacks/{StackName}(这里的{StackName}要和API Gateway的资源路径参数对应)
- 创建栈(CreateStack)对应POST请求,集成路径是
确保请求体正确转发
CloudFormation API接受JSON格式的请求体,所以你需要在API Gateway的集成请求中设置合适的映射模板。对于Content-Type: application/json的请求,直接用$input.json('$')作为模板就能把请求体原样转发给CloudFormation,不需要额外处理。配置必要的IAM权限
API Gateway的执行角色需要具备调用对应CloudFormation操作的权限。你需要给这个角色附加IAM策略,允许它执行cloudformation:CreateStack、cloudformation:UpdateStack等动作(根据你的需求调整),并且指定对应的资源范围(比如特定栈名或通配符*)。注意API版本和响应格式
CloudFormation的REST API固定使用2010-05-15的版本号,所以集成路径里必须包含这个版本,否则请求会失败。另外,默认情况下CloudFormation可能返回XML响应,你可以在集成请求里添加Accept: application/json请求头,让它返回JSON格式的响应,更便于处理。
举个快速配置的例子:
- 在API Gateway中创建一个资源
/stacks - 给这个资源添加POST方法
- 集成类型选AWS Service,服务选CloudFormation,区域选你的目标区域
- 集成路径填
/2010-05-15/stacks - 映射模板里添加
application/json类型,模板内容设为$input.json('$') - 给API Gateway的执行角色添加允许
cloudformation:CreateStack的IAM策略
这样配置后,你向API Gateway的这个POST端点发送符合CloudFormation格式的JSON请求体,就能直接触发栈的创建操作了。
内容的提问来源于stack exchange,提问作者user8958776

