如何将 IAM 角色分配给 SAM 模板中的隐式 API 网关?

How to assign IAM Role to implicit API Gateway in SAM template?

我有一个创建显式 lambda 和隐式 api 网关的 AWS SAM 模板(通过 Events 属性)。我需要为 lambda 和 api 网关分配特定和不同的 IAM 角色。虽然 lambda 角色从 SAM 模板语法中是不言而喻的,但我无法弄清楚如何将角色分配给 api 网关。

例如

# template.yaml
...
Resources:
  MyLambda:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: very-important-lambda
      Handler: src/index.handler
      Runtime: nodejs8.10
      Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/lambda-role-name
      CodeUri: ./build
      # Below event creates an AWS::ApiGateway::RestApi resource, but how do I give that resource an IAM Role?
      Events:
        PostDomainEvent:
          Type: Api
          Properties:
            Method: POST
            Path: "/path/resource/v1"

为什么要向 API 网关添加角色? SAM 将自动(隐式)安排 API 网关有权使用 Lambda 资源策略调用 Lambda 函数(更多信息请参见 API 网关的 docs

如果您想设置 API 网关的资源策略或设置一些其他设置,可以明确定义您的 Lambda 事件使用的 API。

例如设置资源策略:

RestApi:
  Type: AWS::Serverless::Api
  Properties:
    Policy: > 
      {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::123456789012:root"
                    },
                    "Action": "execute-api:Invoke",
                    "Resource": "arn:aws:execute-api:eu-central-1: 123456789012:7mancjlc5z/*"
                }
            ]
        }

Function:
  Type: AWS::Serverless::Function
  Properties:
    Events:
      ApiRequest:
        Type: Api
        Properties:
          Path: /v1/comments
          Method: post
          RestApiId: !Ref RestApi

SAM 文档对此并不完全清楚,但在编写上述设置工作时。