

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

# AppSpec 檔案範例
<a name="reference-appspec-file-example"></a>

本主題提供 AWS Lambda 和 EC2/現場部署的範例 AppSpec 檔案。

**Topics**
+ [Amazon ECS 部署的 AppSpec 檔案範例](#appspec-file-example-ecs)
+ [AWS Lambda 部署的 AppSpec 檔案範例](#appspec-file-example-lambda)
+ [EC2/現場部署的 AppSpec 檔案範例](#appspec-file-example-server)

## Amazon ECS 部署的 AppSpec 檔案範例
<a name="appspec-file-example-ecs"></a>

 以下是以 YAML 寫入以部署 Amazon ECS 服務的 AppSpec 檔案範例。

```
version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "arn:aws:ecs:us-east-1:111222333444:task-definition/my-task-definition-family-name:1"
        LoadBalancerInfo:
          ContainerName: "SampleApplicationName"
          ContainerPort: 80
# Optional properties
        PlatformVersion: "LATEST"
        NetworkConfiguration:
          AwsvpcConfiguration:
            Subnets: ["subnet-1234abcd","subnet-5678abcd"]
            SecurityGroups: ["sg-12345678"]
            AssignPublicIp: "ENABLED"
        CapacityProviderStrategy:
          - Base: 1
            CapacityProvider: "FARGATE_SPOT"
            Weight: 2
          - Base: 0
            CapacityProvider: "FARGATE"
            Weight: 1
Hooks:
  - BeforeInstall: "LambdaFunctionToValidateBeforeInstall"
  - AfterInstall: "LambdaFunctionToValidateAfterInstall"
  - AfterAllowTestTraffic: "LambdaFunctionToValidateAfterTestTrafficStarts"
  - BeforeAllowTraffic: "LambdaFunctionToValidateBeforeAllowingProductionTraffic"
  - AfterAllowTraffic: "LambdaFunctionToValidateAfterAllowingProductionTraffic"
```

 這裡提供前述以 JSON 撰寫的範例版本。

```
{
    "version": 0.0,
    "Resources": [
        {
            "TargetService": {
                "Type": "AWS::ECS::Service",
                "Properties": {
                    "TaskDefinition": "arn:aws:ecs:us-east-1:111222333444:task-definition/my-task-definition-family-name:1",
                    "LoadBalancerInfo": {
                        "ContainerName": "SampleApplicationName",
                        "ContainerPort": 80
                    },
                    "PlatformVersion": "LATEST",
                    "NetworkConfiguration": {
                        "AwsvpcConfiguration": {
                            "Subnets": [
                                "subnet-1234abcd",
                                "subnet-5678abcd"
                            ],
                            "SecurityGroups": [
                                "sg-12345678"
                            ],
                            "AssignPublicIp": "ENABLED"
                        }
                    },
                    "CapacityProviderStrategy": [
                        {
                            "Base" : 1,
                            "CapacityProvider" : "FARGATE_SPOT",
                            "Weight" : 2
                        },
                        {
                            "Base" : 0,
                            "CapacityProvider" : "FARGATE",
                            "Weight" : 1
                        }
                    ]
                }               
            }
        }
    ],
    "Hooks": [
        {
            "BeforeInstall": "LambdaFunctionToValidateBeforeInstall"
        },
        {
            "AfterInstall": "LambdaFunctionToValidateAfterInstall"
        },
        {
            "AfterAllowTestTraffic": "LambdaFunctionToValidateAfterTestTrafficStarts"
        },
        {
            "BeforeAllowTraffic": "LambdaFunctionToValidateBeforeAllowingProductionTraffic"
        },
        {
            "AfterAllowTraffic": "LambdaFunctionToValidateAfterAllowingProductionTraffic"
        }
    ]
}
```

這是部署期間的一系列事件。

1.  在替換任務集上安裝更新的 Amazon ECS 應用程式之前，稱為 的 Lambda 函數會`LambdaFunctionToValidateBeforeInstall`執行。

1.  在替換任務集上安裝更新的 Amazon ECS 應用程式之後，但在接收任何流量之前，稱為 的 Lambda 函數會`LambdaFunctionToValidateAfterInstall`執行。

1.  在替換任務集上的 Amazon ECS 應用程式開始從測試接聽程式接收流量後，稱為 的 Lambda 函數會`LambdaFunctionToValidateAfterTestTrafficStarts`執行。此函數可能執行驗證測試，判斷是否繼續部署。如果您未指定測試部署群組中的測試接聽程式，便會忽略此勾點。

1.  在勾`AfterAllowTestTraffic`點中的任何驗證測試完成後，以及在將生產流量提供給更新的 Amazon ECS 應用程式之前，稱為 `LambdaFunctionToValidateBeforeAllowingProductionTraffic`執行的 Lambda 函數。

1.  在替代任務集上將生產流量提供給更新的 Amazon ECS 應用程式後，名為 的 Lambda 函數會`LambdaFunctionToValidateAfterAllowingProductionTraffic`執行。

 在任何勾點期間執行的 Lambda 函數可以執行驗證測試或收集流量指標。

## AWS Lambda 部署的 AppSpec 檔案範例
<a name="appspec-file-example-lambda"></a>

 以下是以 YAML 撰寫的 AppSpec 檔案範例，用於部署 Lambda 函數版本。

```
version: 0.0
Resources:
  - myLambdaFunction:
      Type: AWS::Lambda::Function
      Properties:
        Name: "myLambdaFunction"
        Alias: "myLambdaFunctionAlias"
        CurrentVersion: "1"
        TargetVersion: "2"
Hooks:
  - BeforeAllowTraffic: "LambdaFunctionToValidateBeforeTrafficShift"
  - AfterAllowTraffic: "LambdaFunctionToValidateAfterTrafficShift"
```

 這裡提供前述以 JSON 撰寫的範例版本。

```
{
 	"version": 0.0,
 	"Resources": [{
 		"myLambdaFunction": {
 			"Type": "AWS::Lambda::Function",
 			"Properties": {
 				"Name": "myLambdaFunction",
 				"Alias": "myLambdaFunctionAlias",
 				"CurrentVersion": "1",
 				"TargetVersion": "2"
 			}
 		}
 	}],
 	"Hooks": [{
 			"BeforeAllowTraffic": "LambdaFunctionToValidateBeforeTrafficShift"
      },
      {
 			"AfterAllowTraffic": "LambdaFunctionToValidateAfterTrafficShift"
 		}
 	]
 }
```

這是部署期間的一系列事件。

1. 將流量從名為 的 Lambda 函數第 1 版轉移到第 2 `myLambdaFunction`版之前，請執行名為 的 Lambda 函數`LambdaFunctionToValidateBeforeTrafficShift`，以驗證部署已準備好開始流量轉移。

1. 如果 `LambdaFunctionToValidateBeforeTrafficShift` 傳回結束代碼 0 (成功)，請開始轉移流量到第 2 版的 `myLambdaFunction`。此部署的部署組態決定了流量轉移速率。

1. 將流量從名為 的 Lambda 函數第 1 版轉移至第 2 `myLambdaFunction`版完成後，請執行名為 的 Lambda 函數`LambdaFunctionToValidateAfterTrafficShift`，以驗證部署是否成功完成。

## EC2/現場部署的 AppSpec 檔案範例
<a name="appspec-file-example-server"></a>

以下是 Amazon Linux、Ubuntu Server 或 RHEL 執行個體就地部署的 AppSpec 檔案範例。

**注意**  
 部署至 Windows Server 執行個體不支援 `runas`元素。如果您要部署到 Windows Server 執行個體，請勿將其包含在 AppSpec 檔案中。

```
version: 0.0
os: linux
files:
  - source: Config/config.txt
    destination: /webapps/Config
  - source: source
    destination: /webapps/myApp
hooks:
  BeforeInstall:
    - location: Scripts/UnzipResourceBundle.sh
    - location: Scripts/UnzipDataBundle.sh
  AfterInstall:
    - location: Scripts/RunResourceTests.sh
      timeout: 180
  ApplicationStart:
    - location: Scripts/RunFunctionalTests.sh
      timeout: 3600
  ValidateService:
    - location: Scripts/MonitorService.sh
      timeout: 3600
      runas: codedeployuser
```

對於 Windows Server 執行個體，`os: linux`請變更為 `os: windows`。而且，您必須有完整的 `destination` 路徑 (例如，`c:\temp\webapps\Config` 和 `c:\temp\webapps\myApp`)。請勿包含 `runas` 元素。

這是部署期間的一系列事件。

1. 執行位於 `Scripts/UnzipResourceBundle.sh` 的指令碼。

1. 如果之前的指令碼傳回 0 結束代碼 (成功)，請執行位於 `Scripts/UnzipDataBundle.sh` 的指令碼。

1. 從 `Config/config.txt` 的路徑複製檔案到 `/webapps/Config/config.txt` 路徑。

1. 以遞迴方式複製 `source` 目錄中的所有檔案到 `/webapps/myApp` 目錄。

1. 以 180 秒 (3分鐘) 的逾時時間於 `Scripts/RunResourceTests.sh` 執行指令碼。

1. 以 3600 秒 (1 小時) 的逾時時間於 `Scripts/RunFunctionalTests.sh` 執行指令碼。

1. 以使用者 `codedeploy` 身分於 3600 秒 (1小時) 的逾時時間執行位於 `Scripts/MonitorService.sh` 的指令碼。