我正在尝试在AWS::Serverless::Api
资源中定义授权者。授权者链接到未在我的堆栈中定义的Lambda,并且在我们帐户中的多个堆栈之间共享。
看来SAM的默认行为是自动添加基于资源的权限,以授予我的API网关调用授权者的权限。我可以在Cloudformation输出中看到AWS::Lambda::Permission
资源正在创建,尽管实际上我的template.yaml文件中没有定义。通常,此行为会很好,但是,当跨多个堆栈发生此行为时,它将导致共享Lambda上的策略文档增长到最终超过AWS大小限制的水平。
要解决此问题,我尝试使用IAM角色来授予对共享的lambda的访问权限,而不是基于资源的权限。但是,即使我指定了用于调用共享lambda的角色,SAM仍在Cloudformation中创建AWS::Lambda::Permission
资源。
有什么方法可以阻止SAM自动生成这些基于资源的权限?
我的API定义如下。您会注意到FunctionInvokeRole
和InvokeRole
属性均已设置。如果这些属性是使用IAM角色定义的,我不会期望创建任何权限资源。
PublicGateway:
Type: AWS::Serverless::Api
Properties:
StageName: latest
EndpointConfiguration: REGIONAL
Cors:
AllowHeaders: '''Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'''
AllowMethods: '''DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'''
AllowOrigin: '''*'''
Auth:
InvokeRole:
Fn::GetAtt:
- MyCustomRole
- Arn
Authorizers:
MyAuthorizer:
FunctionArn:
Fn::Sub: arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:my-shared-lambda-authorizer
FunctionInvokeRole:
Fn::GetAtt:
- MyCustomRole
- Arn
FunctionPayloadType: REQUEST
Identity:
Headers:
- Authorization
ReauthorizeEvery: 600
DefaultAuthorizer: MyAuthorizer
AddDefaultAuthorizerToCorsPreflight: false
DefinitionBody:
Fn::Transform:
Name: AWS::Include
Parameters:
Location: s3://some-s3-bucket-full-of-swagger/swagger.json
Variables:
stageVersion: latest