

這是新的 *CloudFormation 範本參考指南*。請更新您的書籤和連結。如需 CloudFormation 入門的說明，請參閱 [AWS CloudFormation 使用者指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# `AWS::Serverless` 轉換程序
<a name="transform-aws-serverless"></a>

本主題說明如何使用`AWS::Serverless`轉換來處理以無 AWS 伺服器應用程式模型 (AWS SAM) 語法撰寫的範本，並將其轉換為合規的 CloudFormation 範本。

如需有關使用 `AWS::Serverless` 轉換的詳細資訊，請參閱 GitHub 上的 [AWS SAM 轉換](https://github.com/aws/serverless-application-model)。

## Usage
<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` 等資源需要特殊語法。

使用 AWS SAM `Fn::Sub`產生邏輯 ID 參考，而不是使用 語法做為參考 (`MyApi.Stage`)。例如 `"Ref": {"Fn::Sub": "${MyApi}${StageName}Stage"}`。這會在執行時期建置正確的邏輯 ID。

這種特殊格式的原因是因為這兩個轉換處理值的方式不同：
+ `AWS::LanguageExtensions` 會將內建函數解析為其實際值。
+ `AWS::Serverless` 會根據其收到靜態值還是內建函數，來建立不同的邏輯 ID。

## 相關資源
<a name="aws-serverless-related-resources"></a>

如需無伺服器應用程式和無 AWS 伺服器應用程式模型 (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 資源和屬性](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)。