使用 Amazon SAM 连接器管理资源权限 - Amazon Serverless Application Model
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon SAM 连接器管理资源权限

什么是 Amazon SAM 连接器?

连接器是一种 Amazon Serverless Application Model (Amazon SAM) 抽象资源类型,标识为AWS::Serverless::Connector,它在您的无服务器应用程序资源之间提供简单且范围明确的权限。通过将 Connectors 资源属性嵌入到资源中来使用它。然后,定义您的目标资源并描述数据或事件应如何在这些资源之间流动。 Amazon SAM 然后制定必要的访问策略,以促进所需的交互。

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: <source-resource-logical-id>: Type: <resource-type> ... Connectors: <connector-name>: Properties: Destination: <properties-that-identify-destination-resource> Permissions: <permission-types-to-provision> ...

连接器示例

在此示例中,我们使用连接器将 Amazon Lambda 函数中的数据写入到 Amazon DynamoDB 表中。

Lambda 函数使用 Amazon SAM 连接器将数据写入 DynamoDB 表的示意图。
Transform: AWS::Serverless-2016-10-31 Resources: MyTable: Type: AWS::Serverless::SimpleTable MyFunction: Type: AWS::Serverless::Function Connectors: MyConn: Properties: Destination: Id: MyTable Permissions: - Write Properties: Runtime: nodejs16.x Handler: index.handler InlineCode: | const AWS = require("aws-sdk"); const docClient = new AWS.DynamoDB.DocumentClient(); exports.handler = async (event, context) => { await docClient.put({ TableName: process.env.TABLE_NAME, Item: { id: context.awsRequestId, event: JSON.stringify(event) } }).promise(); } Environment: Variables: TABLE_NAME: !Ref MyTable

Connectors 资源属性嵌入在 Lambda 函数源资源中。使用 Id 属性将 DynamoDB 表定义为目标资源。连接器将在这两个资源之间提供 Write 权限。

当您将 Amazon SAM 模板部署到时 Amazon CloudFormation, Amazon SAM 将自动编写此连接正常运行所需的必要访问策略。

源资源和目标资源之间支持的连接

连接器支持源和目标资源连接的精选组合之间的 ReadWrite 数据和事件权限类型。例如,连接器支持 AWS::ApiGateway::RestApi 源资源和 AWS::Lambda::Function 目标资源之间的 Write 连接。

可以使用支持的属性的组合来定义源资源和目标资源。属性要求将取决于您正在建立的连接以及资源定义的位置。

注意

连接器可以在支持的无服务器和非无服务器资源类型之间配置权限。

有关支持的资源连接及其属性要求的列表,请参阅 连接器支持的源资源和目的地资源类型

使用连接器

定义读取和写入权限

可以在单个连接器中配置 ReadWrite 权限:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Lambda::Function Connectors: MyTableConn: Properties: Destination: Id: MyTable Permissions: - Read - Write MyTable: Type: AWS::DynamoDB::Table

使用其他支持的属性定义资源

对于源资源和目标资源,如果在同一个模板中定义,则使用 Id 属性。或者,可以添加 Qualifier 以缩小您定义的资源范围。当资源不在同一个模板中时,请使用受支持属性的组合。

在定义具有 Id 之外属性的源资源时,请使用 SourceReference 属性。

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: <source-resource-logical-id>: Type: <resource-type> ... Connectors: <connector-name>: Properties: SourceReference: Qualifier: <optional-qualifier> <other-supported-properties> Destination: <properties-that-identify-destination-resource> Permissions: <permission-types-to-provision>

以下示例使用 Qualifier 缩小 Amazon API Gateway 资源的范围:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyApi: Type: AWS::Serverless::Api Connectors: ApiToLambdaConn: Properties: SourceReference: Qualifier: Prod/GET/foobar Destination: Id: MyFunction Permissions: - Write ...

以下示例使用支持的 ArnType 组合定义来自另一个模板的目标资源:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Serverless::Function Connectors: TableConn: Properties: Destination: Type: AWS::DynamoDB::Table Arn: !GetAtt MyTable.Arn ...

从单一来源创建多个连接器

在一个源资源中,您可以定义多个连接器,且每个都有不同的目标资源。

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Serverless::Function Connectors: BucketConn: Properties: Destination: Id: MyBucket Permissions: - Read - Write SQSConn: Properties: Destination: Id: MyQueue Permissions: - Read - Write TableConn: Properties: Destination: Id: MyTable Permissions: - Read - Write TableConnWithTableArn: Properties: Destination: Type: AWS::DynamoDB::Table Arn: !GetAtt MyTable.Arn Permissions: - Read - Write ...

创建多目标连接器

在一个源资源中,您可以定义具有多个目标资源的单个连接器。以下是 Lambda 函数源资源的示例,其连接到 Amazon Simple Storage Service(Amazon S3)存储桶和 DynamoDB 表:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Serverless::Function Connectors: WriteAccessConn: Properties: Destination: - Id: OutputBucket - Id: CredentialTable Permissions: - Write ... OutputBucket: Type: AWS::S3::Bucket CredentialTable: Type: AWS::DynamoDB::Table

使用连接器定义资源属性

可以为资源定义资源属性,以指定其他行为和关系。要了解有关资源属性的更多信息,请参阅《Amazon CloudFormation 用户指南》中的资源属性参考

您可以将资源属性添加到嵌入式连接器,方法是在与连接器属性相同的级别上对其进行定义。在部署时转换 Amazon SAM 模板时,属性将传递给生成的资源。

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Serverless::Function Connectors: MyConn: DeletionPolicy: Retain DependsOn: AnotherFunction Properties: ...

连接器的工作原理

注意

本节介绍连接器如何在幕后提供必要的资源。使用连接器时,这种情况会自动发生。

首先,嵌入的 Connectors 资源属性转换为 AWS::Serverless::Connector 资源类型。它的逻辑 ID 会自动创建为 < source-resource-logical-id >< embedded-connector-logical-id >

例如,这是嵌入式连接器:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Lambda::Function Connectors: MyConn: Properties: Destination: Id: MyTable Permissions: - Read - Write MyTable: Type: AWS::DynamoDB::Table

这将生成以下 AWS::Serverless::Connector 资源:

Transform: AWS::Serverless-2016-10-31 Resources: ... MyFunctionMyConn: Type: AWS::Serverless::Connector Properties: Source: Id: MyFunction Destination: Id: MyTable Permissions: - Read - Write
注意

您也可以使用此语法在 Amazon SAM 模板中定义连接器。如果源资源定义于与连接器不同的模板上,则建议使用此方法。

接下来,将自动编写该连接必要的访问策略。有关连接器生成的资源的更多信息,请参阅 在指定了 AWS::Serverless::Connector 的情况下生成的 Amazon CloudFormation 资源

Amazon SAM 连接器的好处

通过在资源之间自动编写适当的访问策略,连接器使您能够编写无服务器应用程序并专注于应用程序架构,而无需在 Amazon 授权功能、策略语言和特定于服务的安全设置方面的专业知识。因此,对于可能不熟悉无服务器开发的开发人员或希望提高开发速度的经验丰富的开发人员来说,连接器十分有用。

了解更多信息

有关使用 Amazon SAM 连接器的更多信息,请参见AWS::Serverless::Connector

提供反馈

要提供有关连接器的反馈,请在serverless-application-model Amazon GitHub存储库中提交新问题