无服务器AWS堆栈-是否需要将具有AAM角色的ApiGatewayRestApi与IAM角色一起使用,没有Lambda或HTTP端点?

问题描述

我目前有一个部署到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端点特定的角色。