

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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>

 다음은 Amazon ECS 서비스를 배포하기 위해 YAML로 작성된 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 애플리케이션을 대체 작업 세트에 설치하기 전에 `LambdaFunctionToValidateBeforeInstall`(이)라는 Lambda 함수가 실행됩니다.

1.  업데이트된 Amazon ECS 애플리케이션을 대체 작업 세트에 설치했지만 트래픽을 수신하기 전에 `LambdaFunctionToValidateAfterInstall`(이)라는 Lambda 함수가 실행됩니다.

1.  대체 작업 세트의 Amazon ECS 애플리케이션은 테스트 리스너에서 트래픽을 수신하기 시작한 후, `LambdaFunctionToValidateAfterTestTrafficStarts`(이)라는 Lambda 함수가 실행됩니다. 이 함수는 배포가 계속되는지 여부를 확인하는 확인 테스트를 실행할 가능성이 있습니다. 배포 그룹에서 테스트 리스너를 지정하지 않는 경우, 이 후크는 무시됩니다.

1.  `AfterAllowTestTraffic` 후크의 확인 테스트가 완료되고 프로덕션 트래픽이 업데이트된 Amazon ECS 애플리케이션에 제공되기 전에, `LambdaFunctionToValidateBeforeAllowingProductionTraffic`(이)라는 Lambda 함수가 실행됩니다.

1.  프로덕션 트래픽이 대체 작업 세트의 업데이트된 Amazon ECS 애플리케이션에 제공된 후 `LambdaFunctionToValidateAfterAllowingProductionTraffic`(이)라는 Lambda 함수가 실행됩니다.

 후크 중에 실행되는 Lambda 함수는 확인 테스트를 수행하거나 트래픽 지표를 수집할 수 있습니다.

## AWS Lambda 배포에 대한 AppSpec 파일 예제
<a name="appspec-file-example-lambda"></a>

 다음은 Lambda 함수 버전을 배포하기 위해 YAML로 작성된 AppSpec 파일의 예입니다.

```
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. `myLambdaFunction`(이)라는 Lambda 함수 버전 1의 트래픽을 버전 2로 전환하기 전에 배포가 트래픽 전환을 시작할 준비가 되었는지 확인하기 위해 `LambdaFunctionToValidateBeforeTrafficShift`(이)라는 Lambda 함수를 실행합니다.

1. `LambdaFunctionToValidateBeforeTrafficShift`가 종료 코드 0(성공)을 반환하면 `myLambdaFunction` 버전 2로 트래픽 이동을 시작합니다. 이 배포에 대한 배포 구성은 트래픽 이동 속도를 지정합니다.

1. `myLambdaFunction`(이)라는 Lambda 함수 버전 1의 트래픽을 버전 2로 전환하는 작업이 완료되면 배포가 성공적으로 완료되었는지 확인하기 위해 `LambdaFunctionToValidateAfterTrafficShift`(이)라는 Lambda 함수를 실행합니다.

## 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. `Scripts/RunResourceTests.sh`에 있는 스크립트를 실행합니다. 제한 시간은 180초(3분)입니다.

1. `Scripts/RunFunctionalTests.sh`에 있는 스크립트를 실행합니다. 제한 시간은 3600초(1시간)입니다.

1. `Scripts/MonitorService.sh`에 있는 스크립트를 사용자 `codedeploy`로 실행합니다. 제한 시간은 3600초(1시간)입니다.