问题描述
我目前有一个部署到AWS的堆栈,该堆栈具有许多REST端点(Lambda函数),一些其他用于维护操作的Lambda,以及DynamoDB,Cognito用户池,弹性搜索域,IAM角色等。无服务器框架,使用serverless.yml定义堆栈。
为了避免200个资源的限制(并获得更好的结构),我正在尝试将当前堆栈拆分为多个堆栈。
计划是使用持久化数据(DynamoDB,Elastic Search,Cognito,IAM等)为所有资源保留当前堆栈,然后为lambda函数定义新堆栈。一个用于维护功能,另外两个用于不同类型的堆栈,用于HTTP通过API网关调用的功能。
现在是问题所在:我已注释掉functions:
的整个serverless.yml
部分。
resources:
- ${file(resources/dynamoDb.yml)}
- ${file(resources/cognito.yml)}
- ${file(resources/iam.yml)}
- ${file(resources/elasticsearch.yml)}
Error: The CloudFormation template is invalid: Template format error: Unresolved resource dependencies [ApiGatewayRestApi] in the Resources block of the template
出现此错误的原因可能是因为我在ApiGatewayRestApi
中引用了resources/iam.yml
:
GetVehicleByLicensePlatePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: GetVehicleByLicensePlate
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: execute-api:Invoke
Resource:
Fn::Join:
- ""
- - "arn:aws:execute-api"
- ":"
- Ref: AWS::Region
- ":"
- Ref: AWS::AccountId
- ":"
- Ref: ApiGatewayRestApi
- "/*/GET/vehicles/licenseplate/*"
我了解,ApiGatewayRestApi
引用在我删除了HTTP触发的所有功能后仍无法解决,因为此堆栈中没有部署API网关。
我将在其他两个堆栈中使用HTTP lambda函数,但是这些堆栈将依赖于此。 (而且我当然不希望循环依赖。)
那么如何使我的“主”堆栈引用子堆栈使用的API网关?
解决方法
我想我通过将API网关特定的IAM角色移动到包含相关端点的堆栈中来解决此问题。这实际上对我来说很有意义,因为根堆栈不需要了解api端点特定的角色。