

这是新的《CloudFormation 模板参考指南》**。请更新您的书签和链接。有关开始使用 CloudFormation 的帮助，请参阅《AWS CloudFormation 用户指南》[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。

# `AWS::Serverless` 转换
<a name="transform-aws-serverless"></a>

本主题介绍如何使用 `AWS::Serverless` 转换处理用 AWS Serverless Application Model（AWS SAM）语法编写的模板处理并将其转换为符合规范的 CloudFormation 模板。

有关使用 `AWS::Serverless` 转换的更多信息，请参阅 GitHub 上的 [AWS SAM transform](https://github.com/aws/serverless-application-model)。

## 用法
<a name="aws-serverless-usage"></a>

要使用 `AWS::Serverless` 转换，您必须在 CloudFormation 模板的顶层对其进行声明。`AWS::Serverless` 不能用作嵌入在任何其他模板部分中的转换。

该声明的值必须为文本字符串 `AWS::Serverless-2016-10-31`。您无法使用参数或函数来指定转换值。

### 语法
<a name="aws-serverless-syntax"></a>

要在 CloudFormation 模板中声明该转换，请使用以下语法：

#### JSON
<a name="aws-serverless-syntax.json"></a>

```
{
  "Transform":"AWS::Serverless-2016-10-31",
  "Resources":{
    ...
  }
}
```

#### YAML
<a name="aws-serverless-syntax.yaml"></a>

```
Transform: AWS::Serverless-2016-10-31
Resources:
  ...
```

`AWS::Serverless` 转换是一个独立的声明，没有其他参数。

## 示例
<a name="aws-serverless-examples"></a>

以下示例展示了如何使用 `AWS::Serverless` 转换和 AWS SAM 语法，来简化 Lambda 函数及其执行角色的声明。

### JSON
<a name="aws-serverless-example.json"></a>

```
{
  "Transform":"AWS::Serverless-2016-10-31",
  "Resources":{
    "MyFunction":{
      "Type":"AWS::Serverless::Function",
      "Properties":{
        "Handler":"index.handler",
        "Runtime":"nodejs20.x",
        "CodeUri":"s3://amzn-s3-demo-bucket/MySourceCode.zip"
      }
    }
  }
}
```

### YAML
<a name="aws-serverless-example.yaml"></a>

```
Transform: AWS::Serverless-2016-10-31
Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs20.x
      CodeUri: 's3://amzn-s3-demo-bucket/MySourceCode.zip'
```

从模板创建更改集时，CloudFormation 会按照该转换的定义展开 AWS SAM 语法。处理后的模板会展开 `AWS::Serverless::Function` 资源，并声明一个 Lambda 函数和一个执行角色。

```
{
  "Resources": {
    "MyFunction": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Code": {
          "S3Bucket": "amzn-s3-demo-bucket",
          "S3Key": "MySourceCode.zip"
        },
        "Role": {
          "Fn::GetAtt": ["MyFunctionRole", "Arn"]
        },
        "Runtime": "nodejs20.x"
      }
    },
    "MyFunctionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"],
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [{
            "Action": ["sts:AssumeRole"],
            "Effect": "Allow",
            "Principal": {
              "Service": ["lambda.amazonaws.com"]
            }
          }]
        }
      }
    }
  }
}
```

## 将 `AWS::Serverless` 与 `AWS::LanguageExtensions` 搭配使用
<a name="aws-serverless-language-extensions"></a>

如果同时使用 `AWS::Serverless` 和 `AWS::LanguageExtensions`，当阶段名称作为非 `NoEcho` 参数值传递时，引用 `AWS::ApiGateway::Stage` 等资源需要特殊语法。

请使用 `Fn::Sub` 生成逻辑 ID 引用，而不要对引用 (`MyApi.Stage`) 使用 AWS SAM 语法。例如 `"Ref": {"Fn::Sub": "${MyApi}${StageName}Stage"}`。这将在运行时生成正确的逻辑 ID。

之所以使用此特殊格式是因为这两种转换对值的处理方式不同：
+ `AWS::LanguageExtensions` 将内置函数解析为其实际值。
+ `AWS::Serverless` 会创建不同的逻辑 ID，具体取决于它接收的是静态值还是内置函数。

## 相关资源
<a name="aws-serverless-related-resources"></a>

有关无服务器应用程序和 AWS Serverless Application Model（AWS SAM）的更多信息，请参阅 [AWS Serverless Application Model 开发人员指南](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)。

有关特定于 AWS SAM 的资源和属性类型，请参阅《AWS Serverless Application Model 开发人员指南》中的 [AWS SAM resources and properties](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification-resources-and-properties.html)**。

有关使用宏的一般信息，请参阅《AWS CloudFormation 用户指南》**中的 [使用模板宏对 CloudFormation 模板执行自定义处理](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html)。