

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

# Step Functions에서 버전 및 별칭을 사용하여 지속적인 배포 관리
<a name="concepts-cd-aliasing-versioning"></a>

Step Functions를 사용하여 상태 머신 *버전* 및 *별칭*을 통해 워크플로의 지속적인 배포를 관리할 수 있습니다. *버전*은 실행 가능한 상태 머신의 번호가 매겨져 있고 변경할 수 없는 스냅샷입니다. *별칭*은 상태 머신 버전을 최대 2개까지 가리킵니다.

상태 머신 버전을 여러 개 유지하고 프로덕션 워크플로에서 상태 머신 배포를 관리할 수 있습니다. 별칭을 사용하면 서로 다른 워크플로 버전 간에 트래픽을 라우팅하고 점진적으로 해당 워크플로를 프로덕션 환경에 배포할 수 있습니다.

또한 버전이나 별칭을 사용하여 상태 머신 실행을 시작할 수 있습니다. 상태 머신 실행을 시작할 때 버전이나 별칭을 사용하지 않으면 Step Functions에서 상태 머신 정의의 최신 버전을 사용합니다.

**상태 머신 개정**  
상태 머신에는 개정이 하나 이상 있을 수 있습니다. [UpdateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html) API 작업을 사용하여 상태 머신을 업데이트하면 새 상태 머신 개정이 생성됩니다. *개정*은 상태 머신 정의 및 구성의 변경할 수 없는 읽기 전용 스냅샷입니다. 개정에서 상태 머신 실행을 시작할 수 없으며 개정에는 ARN이 없습니다. 개정에는 범용 고유 식별자(UUID)인 `revisionId`가 있습니다.

**Topics**
+ [버전](concepts-state-machine-version.md)
+ [별칭](concepts-state-machine-alias.md)
+ [버전 및 별칭 권한 부여](auth-version-alias.md)
+ [실행을 버전 또는 별칭과 연결](execution-alias-version-associate.md)
+ [배포 예제](example-alias-version-deployment.md)
+ [버전 점진적 배포](version-rolling-deployment.md)

# Step Functions 워크플로의 상태 시스템 버전
<a name="concepts-state-machine-version"></a>

*버전*은 번호가 매겨져 있으며 **변경할 수 없는** 상태 시스템 스냅샷입니다. 해당 상태 시스템에 적용된 최신 버전에서 버전을 게시합니다. 각 버전에는 상태 시스템 ARN과 콜론(:)으로 구분된 버전 번호의 조합인 고유한 Amazon 리소스 이름(ARN)이 있습니다. 다음 예제에서는 상태 시스템 버전 ARN의 형식을 보여줍니다.

```
arn:partition:states:region:account-id:stateMachine:myStateMachine:1
```

상태 시스템 버전을 사용하려면 첫 번째 버전을 게시해야 합니다. 버전을 게시한 후에는 버전 ARN으로 [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) API 작업을 간접적으로 호출할 수 있습니다. 버전을 편집할 수 없지만 상태 시스템을 업데이트하고 새 버전을 게시할 수 있습니다. 상태 시스템 버전 여러 개를 게시할 수도 있습니다.

![\[버전이 상태 시스템의 변경할 수 없는 스냅샷인 방법을 보여주는 퍼지 예시 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/versioning-concept.png)


새 상태 시스템 버전을 게시하면 Step Functions에서 버전 번호를 할당합니다. 버전 번호는 1부터 시작하며 새 버전이 나올 때마다 단조롭게 증가합니다. 지정된 상태 시스템에는 버전 번호가 다시 사용되지 않습니다. 상태 시스템 버전 10을 삭제한 다음 새 버전을 게시하면 Step Functions에서 상태 시스템을 버전 11로 게시합니다.

다음 속성은 상태 시스템의 모든 버전에서 동일합니다.
+ 상태 시스템의 모든 버전은 동일한 유형[(표준 또는 Express)](choosing-workflow-type.md)을 공유합니다.
+ 버전 간에 상태 시스템 이름이나 만든 날짜를 변경할 수 없습니다.
+ 태그는 전역적으로 상태 시스템에 적용됩니다. [TagResource](https://docs.aws.amazon.com/step-functions/latest/apireference/API_TagResource.html) 및 [UntagResource](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UntagResource.html) API 작업을 사용하여 상태 시스템의 태그를 관리할 수 있습니다.

상태 시스템에도 각 버전 및 [revision](concepts-cd-aliasing-versioning.md#statemachinerev)에 속하는 속성이 포함되지만 이러한 속성은 두 가지 지정된 버전이나 개정마다 다를 수 있습니다. 이러한 속성에는 [상태 시스템 정의](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html#StepFunctions-UpdateStateMachine-request-definition), [IAM 역할](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html#StepFunctions-UpdateStateMachine-request-roleArn), [추적 구성](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html#StepFunctions-UpdateStateMachine-request-tracingConfiguration) 및 [로깅 구성](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html#StepFunctions-UpdateStateMachine-request-loggingConfiguration)이 포함됩니다.

## 상태 시스템 버전 게시(콘솔)
<a name="procedure-create-versions"></a>

상태 시스템 버전을 최대 1,000개까지 게시할 수 있습니다. 이 소프트 한도 증가를 요청하려면 [AWS Management Console](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)의 **지원 센터** 페이지를 사용합니다. 콘솔에서 또는 [DeleteStateMachineVersion](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DeleteStateMachineVersion.html) API 작업을 간접적으로 호출하여 사용하지 않는 버전을 수동으로 삭제할 수 있습니다.

**상태 머신 버전 게시하기**

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 기존 상태 시스템을 선택합니다.

1. **상태 시스템 세부 정보** 페이지에서 **편집**을 선택합니다.

1. 필요에 따라 상태 시스템 정의를 편집한 다음 **저장**을 선택합니다.

1. **Publish version(버전 게시)**을 선택합니다.

1. (선택 사항) 나타나는 대화 상자의 **설명** 필드에 상태 시스템 버전에 대한 간략한 설명을 입력합니다.

1. **게시**를 선택합니다.

**참고**  
새 상태 시스템 버전을 게시하면 Step Functions에서 버전 번호를 할당합니다. 버전 번호는 1부터 시작하며 새 버전이 나올 때마다 단조롭게 증가합니다. 지정된 상태 시스템에는 버전 번호가 다시 사용되지 않습니다. 상태 시스템 버전 10을 삭제한 다음 새 버전을 게시하면 Step Functions에서 상태 시스템을 버전 11로 게시합니다.

## Step Functions API 작업을 사용하여 버전 관리
<a name="manage-versions-with-api"></a>

Step Functions는 상태 시스템 버전을 게시하고 관리하도록 다음 API 작업을 제공합니다.
+ [PublishStateMachineVersion](https://docs.aws.amazon.com/step-functions/latest/apireference/API_PublishStateMachineVersion.html) - 상태 시스템의 현재 [revision](concepts-cd-aliasing-versioning.md#statemachinerev)에서 버전을 게시합니다.
+ [UpdateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html) - 상태 시스템을 업데이트하고 동일한 요청에서 `publish` 파라미터를 `true`로 설정한 경우 새 상태 시스템 버전을 게시합니다.
+ [CreateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachine.html) - `publish` 파라미터를 `true`로 설정한 경우 상태 시스템의 첫 번째 개정을 게시합니다.
+ [ListStateMachineVersions](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ListStateMachineVersions.html) - 지정된 상태 시스템 ARN의 버전을 나열합니다.
+ [DescribeStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeStateMachine.html) - `stateMachineArn`에 지정된 버전 ARN의 상태 시스템 버전 세부 정보를 반환합니다.
+ [DeleteStateMachineVersion](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DeleteStateMachineVersion.html) - 상태 시스템 버전을 삭제합니다.

를 `myStateMachine` 사용하여 라는 상태 시스템의 현재 개정에서 새 버전을 게시하려면 `publish-state-machine-version` 명령을 AWS Command Line Interface사용합니다.

```
aws stepfunctions publish-state-machine-version --state-machine-arn arn:aws:states:region:account-id:stateMachine:myStateMachine
```

응답은 `stateMachineVersionArn`을 반환합니다. 예를 들어 이전 명령은 `arn:aws:states:region:account-id:stateMachine:myStateMachine:1`에 대한 응답을 반환합니다.

**참고**  
새 상태 시스템 버전을 게시하면 Step Functions에서 버전 번호를 할당합니다. 버전 번호는 1부터 시작하며 새 버전이 나올 때마다 단조롭게 증가합니다. 지정된 상태 시스템에는 버전 번호가 다시 사용되지 않습니다. 상태 시스템 버전 10을 삭제한 다음 새 버전을 게시하면 Step Functions에서 상태 시스템을 버전 11로 게시합니다.

## 콘솔에서 상태 시스템 버전 실행
<a name="procedure-run-version"></a>

상태 시스템 버전을 시작하려면 먼저 현재 상태 시스템 [revision](concepts-cd-aliasing-versioning.md#statemachinerev)에서 버전을 게시해야 합니다. 버전을 게시하려면 Step Functions 콘솔을 사용하거나 [PublishStateMachineVersion](https://docs.aws.amazon.com/step-functions/latest/apireference/API_PublishStateMachineVersion.html) API 작업을 간접적으로 호출합니다. 선택적 파라미터 `publish`를 사용하여 [UpdateStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachineAlias.html) API 작업을 간접적으로 호출해 상태 시스템을 업데이트하고 해당 버전을 게시할 수도 있습니다.

콘솔을 사용하거나 [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) API 작업을 간접적으로 호출하고 버전 ARN을 제공하여 버전 실행을 시작할 수 있습니다. [별칭](concepts-state-machine-alias.md)을 사용하여 버전 실행을 시작할 수도 있습니다. [라우팅 구성](concepts-state-machine-alias.md#alias-routing-config)에 따라 별칭에서 트래픽을 특정 버전으로 라우팅합니다.

버전을 사용하지 않고 상태 시스템 실행을 시작하면 Step Functions는 상태 시스템 최신 개정을 실행에 사용합니다. Step Functions에서 실행을 버전과 연결하는 방식은 [실행을 버전 또는 별칭과 연결](execution-alias-version-associate.md) 섹션을 참조하세요.

**상태 시스템 버전을 사용하여 실행 시작하기**

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 버전을 하나 이상 게시한 기존 상태 시스템을 선택합니다. 버전을 게시하는 방법은 [상태 시스템 버전 게시(콘솔)](#procedure-create-versions) 섹션을 참조하세요.

1. **상태 시스템 세부 정보** 페이지에서 **버전** 탭을 선택합니다.

1. **버전** 섹션에서 다음을 수행합니다.

   1. 실행을 시작할 버전을 선택합니다.

   1. **실행 시작**을 선택합니다.

1. (선택 사항) **실행 시작** 대화 상자에 실행 이름을 입력합니다.

1. (선택 사항) 실행 입력을 입력한 다음 **실행 시작**을 선택합니다.

# Step Functions 워크플로의 상태 머신 별칭
<a name="concepts-state-machine-alias"></a>

*별칭*은 같은 상태 머신의 버전을 최대 2개까지 가리킵니다. 상태 머신 별칭을 여러 개 만들 수 있습니다. 별칭마다 고유한 Amazon 리소스 이름(ARN)이 있습니다. 별칭 ARN은 상태 머신 ARN과 별칭 이름의 조합이며 콜론(:)으로 구분됩니다. 다음 예제에서는 상태 머신 별칭 ARN의 형식을 보여줍니다.

```
arn:partition:states:region:account-id:stateMachine:myStateMachine:aliasName
```

별칭을 사용하여 두 상태 머신 버전 중 하나 간에 [트래픽을 라우팅](#alias-routing-config)할 수 있습니다. 단일 버전을 가리키는 별칭을 만들 수도 있습니다. 별칭은 상태 머신 버전만 가리킬 수 있습니다. 별칭을 사용하여 다른 별칭을 가리킬 수는 없습니다. 상태 머신의 다른 버전을 가리키도록 별칭을 업데이트할 수도 있습니다.

![\[요청의 80%를 v1로 보내고 20%를 v2로 보내는 별칭을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/aliases-concept.png)


**Topics**
+ [

## 상태 머신 별칭 만들기(콘솔)
](#procedure-create-aliases)
+ [API를 사용하여 별칭 관리](#manage-aliases-with-api)
+ [

## 별칭 라우팅 구성
](#alias-routing-config)
+ [

## 별칭을 사용하여 상태 머신 실행(콘솔)
](#procedure-run-exec-with-alias)

## 상태 머신 별칭 만들기(콘솔)
<a name="procedure-create-aliases"></a>

Step Functions 콘솔을 사용하거나 [CreateStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachineAlias.html) API 작업을 간접적으로 호출하여 상태 머신마다 별칭을 최대 100개까지 만들 수 있습니다. 이 소프트 한도 증가를 요청하려면 [AWS Management Console](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)의 **지원 센터** 페이지를 사용합니다. 콘솔에서 또는 [DeleteStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DeleteStateMachineAlias.html) API 작업을 간접적으로 호출하여 사용하지 않는 별칭을 삭제합니다.

**상태 머신 별칭 만들기**

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 기존 상태 머신을 선택합니다.

1. **상태 머신 세부 정보** 페이지에서 **별칭** 탭을 선택합니다.

1. **새 별칭 생성**을 선택합니다.

1. **별칭 생성(Create alias)** 페이지에서 다음을 수행합니다.

   1. **별칭 이름**을 입력합니다.

   1. (선택 사항) 경보에 대한 **설명(Description)**을 입력합니다.

1. 별칭에 대한 라우팅을 구성하려면 [별칭 라우팅 구성](#alias-routing-config)을 참조하세요.

1. **별칭 생성**을 선택합니다.

## Step Functions API 작업으로 별칭 관리
<a name="manage-aliases-with-api"></a>

Step Functions는 상태 머신 별칭을 생성 및 관리하거나 별칭에 대한 정보를 가져오는 데 사용할 수 있는 다음 API 작업을 제공합니다.
+ [CreateStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachineAlias.html) - 상태 머신 별칭을 만듭니다.
+ [DescribeStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeStateMachineAlias.html) - 상태 머신 별칭에 대한 세부 정보를 반환합니다.
+ [ListStateMachineAliases](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ListStateMachineAliases.html) - 지정된 상태 머신 ARN의 별칭을 나열합니다.
+ [UpdateStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachineAlias.html) - `description` 또는 `routingConfiguration`을 수정하여 기존 상태 머신 별칭 구성을 업데이트합니다.
+ [DeleteStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DeleteStateMachineAlias.html) - 상태 머신 별칭을 삭제합니다.

를 `myStateMachine` 사용하여 라는 상태 시스템의 버전 1을 가리키`PROD`는 라는 별칭을 생성하려면 `create-state-machine-alias` 명령을 AWS Command Line Interface사용합니다.

```
aws stepfunctions create-state-machine-alias --name PROD  --routing-configuration "[{\"stateMachineVersionArn\":\"arn:aws:states:region:account-id:stateMachine:myStateMachine:1\",\"weight\":100}]"
```

## 별칭 라우팅 구성
<a name="alias-routing-config"></a>

별칭을 사용하여 상태 머신 두 버전 간에 실행 트래픽을 라우팅할 수 있습니다. 새 버전의 상태 머신을 시작하려는 경우를 예로 들어 보겠습니다. 별칭에 대한 라우팅을 구성하여 새 버전 배포와 관련된 위험을 줄일 수 있습니다. 라우팅을 구성하면 대부분의 트래픽을 테스트를 거친 상태 머신의 이전 버전으로 보낼 수 있습니다. 그러면 새 버전을 롤포워드해도 안전한지 확인할 때까지 새 버전에 더 적은 비율을 보낼 수 있습니다.

라우팅 구성을 정의하려면 별칭에서 가리키는 상태 머신 버전 두 개 모두 게시해야 합니다. 별칭에서 실행을 시작하면 Step Functions는 라우팅 구성에 지정된 버전 중에서 실행할 상태 머신 버전을 임의로 선택합니다. 이 선택은 별칭 라우팅 구성에서 각 버전에 할당하는 트래픽 비율을 기반으로 합니다.



**별칭에 대한 라우팅 구성 구성하기**
+ **별칭 만들기** 페이지의 **라우팅 구성**에서 다음을 수행합니다.

  1. **버전**에서 별칭이 가리키는 첫 번째 상태 머신 버전을 선택합니다.

  1. **두 버전 간 트래픽 분할** 확인란을 선택합니다.
**작은 정보**  
단일 버전을 가리키려면 **두 버전 간 트래픽 분할** 확인란을 선택 취소하세요.

  1. **버전**에서 별칭이 가리켜야 하는 두 번째 버전을 선택합니다.

  1. **트래픽 비율** 필드에서 각 버전으로 라우팅할 트래픽 비율을 지정합니다. 예를 들어 실행 트래픽의 60%를 첫 번째 버전으로, 40%를 두 번째 버전으로 라우팅하려면 **60** 및 **40**을 입력합니다.

     합친 트래픽 비율은 100%이어야 합니다.

## 별칭을 사용하여 상태 머신 실행(콘솔)
<a name="procedure-run-exec-with-alias"></a>

콘솔에서 별칭을 사용하거나 별칭 ARN으로 [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) API 작업을 간접적으로 호출하여 상태 머신 실행을 시작할 수 있습니다. 그러면 Step Functions에서 별칭으로 지정된 버전을 실행합니다. 상태 머신 실행을 시작할 때 버전이나 별칭을 지정하지 않으면 Step Functions는 기본적으로 최신 버전을 사용합니다.

**별칭을 사용하여 상태 머신 실행 시작하기**

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 별칭을 만든 기존 상태 머신을 선택합니다. 별칭을 만드는 방법은 [상태 머신 별칭 만들기(콘솔)](#procedure-create-aliases) 섹션을 참조하세요.

1. **상태 머신 세부 정보** 페이지에서 **별칭** 탭을 선택합니다.

1. **별칭** 섹션에서 다음을 수행합니다.

   1. 실행을 시작할 별칭을 선택합니다.

   1. **실행 시작**을 선택합니다.

1. (선택 사항) **실행 시작** 대화 상자에 실행 이름을 입력합니다.

1. 필요한 경우 실행 입력을 입력한 다음 **실행 시작**을 선택합니다.

# Step Functions 워크플로의 버전 및 별칭 권한 부여
<a name="auth-version-alias"></a>

버전 또는 별칭을 사용하여 Step Functions API 작업을 간접적으로 호출하려면 적절한 권한이 필요합니다. API 작업을 간접적으로 호출하도록 버전이나 별칭에 권한을 부여하기 위해 Step Functions는 버전 ARN 또는 별칭 ARN을 사용하는 대신 상태 머신의 ARN을 사용합니다. 특정 버전이나 별칭에 대한 권한의 범위를 좁힐 수도 있습니다. 자세한 내용은 [권한 범위 축소](#auth-scope-permission-version-alias) 단원을 참조하십시오.

`myStateMachine`이라는 상태 머신의 다음 IAM 정책 예제를 사용하면 [CreateStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachineAlias.html) API 작업을 간접적으로 호출하여 상태 머신 별칭을 만들 수 있습니다.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "states:CreateStateMachineAlias",
      "Resource": "arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachine"
    }
  ]
}
```

상태 머신 버전이나 별칭을 사용하여 API 작업에 대한 액세스를 허용하거나 거부할 수 있는 권한을 설정할 때는 다음 사항을 고려하세요.
+ [CreateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachine.html) 및 [UpdateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html) API 작업의 `publish` 파라미터를 사용하여 새 상태 머신 버전을 게시하는 경우 [PublishStateMachineVersion](https://docs.aws.amazon.com/step-functions/latest/apireference/API_PublishStateMachineVersion.html) API 작업에 대한 `ALLOW` 권한도 필요합니다.
+ [DeleteStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DeleteStateMachine.html) API 작업은 상태 머신과 관련된 모든 버전 및 별칭을 삭제합니다.

## 버전 또는 별칭에 대한 권한 범위 축소
<a name="auth-scope-permission-version-alias"></a>

한정자를 사용하여 버전이나 별칭에 필요한 권한을 부여할 수 있는 권한의 범위를 더 좁힐 수 있습니다. 한정자는 버전 번호나 별칭 이름을 나타냅니다. 한정자를 사용하여 상태 머신을 검증할 수 있습니다. 다음 예제는 한정자로 `PROD`라는 별칭을 사용하는 상태 머신 ARN입니다.

```
arn:aws:states:region:account-id:stateMachine:myStateMachine:PROD
```

검증된 ARN 및 검증되지 않은 ARN에 대한 자세한 내용은 [실행을 버전 또는 별칭과 연결](execution-alias-version-associate.md) 섹션을 참조하세요.

IAM 정책의 `Condition` 문에서 `states:StateMachineQualifier`라는 선택적 컨텍스트 키를 사용하여 권한 범위를 좁힙니다. 예를 들어 `myStateMachine`이라는 상태 머신에 대한 다음 IAM 정책은 `PROD`라는 별칭이나 버전 `1`을 사용하여 [DescribeStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeStateMachine.html) API 작업을 간접적으로 호출할 수 있는 액세스를 거부합니다.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "states:DescribeStateMachine",
      "Resource": "arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachine",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "states:StateMachineQualifier": [
            "PROD",
            "1"
          ]
        }
      }
    }
  ]
}
```

다음 목록에서는 `StateMachineQualifier` 컨텍스트 키를 사용하여 권한 범위를 좁힐 수 있는 API 작업을 지정합니다.
+ [CreateStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachineAlias.html)
+ [DeleteStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DeleteStateMachineAlias.html)
+ [DeleteStateMachineVersion](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DeleteStateMachineVersion.html)
+ [DescribeStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeStateMachine.html)
+ [DescribeStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeStateMachineAlias.html)
+ [ListExecutions](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ListExecutions.html)
+ [ListStateMachineAliases](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ListStateMachineAliases.html)
+ [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)
+ [StartSyncExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartSyncExecution.html)
+ [UpdateStateMachineAlias](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachineAlias.html)

# Step Functions에서 실행을 버전 또는 별칭과 연결하는 방법
<a name="execution-alias-version-associate"></a>

Step Functions는 [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) API 작업을 간접적으로 호출하는 데 사용하는 Amazon 리소스 이름(ARN)을 기반으로 한 버전 또는 별칭과 실행을 연결합니다. Step Functions는 실행 시작 시간에 이 작업을 수행합니다.

정규화된 또는 정규화되지 않은 ARN을 사용하여 상태 시스템 실행을 시작할 수 있습니다.
+ **정규화된 ARN** - 버전 번호 또는 별칭 이름이 접미사로 추가된 상태 시스템 ARN을 의미합니다.

  다음 정규화된 ARN 예제는 `myStateMachine`이라는 상태 시스템의 버전 `3`을 참조합니다.

  ```
  arn:aws:states:region:account-id:stateMachine:myStateMachine:3
  ```

  다음 정규화된 ARN 예제는 `myStateMachine`이라는 상태 시스템의 `PROD` 별칭을 참조합니다.

  ```
  arn:aws:states:region:account-id:stateMachine:myStateMachine:PROD
  ```
+ **정규화되지 않은 ARN** - 버전 번호나 별칭 이름 접미사가 없는 상태 시스템 ARN을 의미합니다.

  ```
  arn:aws:states:region:account-id:stateMachine:myStateMachine
  ```

예를 들어 정규화된 ARN에서 버전 `3`을 참조하면 Step Functions는 실행을 이 버전과 연결합니다. 버전 `3`을 가리키는 별칭과 실행을 연결하지 않습니다.

정규화된 ARN에서 별칭을 참조하면 Step Functions는 실행을 해당 별칭 및 별칭이 가리키는 버전과 연결합니다. 실행을 별칭 하나에만 연결할 수 있습니다.

**참고**  
정규화되지 않은 ARN으로 실행을 시작하면 Step Functions는 버전에서 같은 상태 시스템 [revision](concepts-cd-aliasing-versioning.md#statemachinerev)을 사용하더라도 해당 실행을 버전과 연결하지 않습니다. 예를 들어 버전 3에서 최신 버전을 사용하지만 정규화되지 않은 ARN으로 실행을 시작하면 Step Functions는 해당 실행을 버전 3과 연결하지 않습니다.

## 버전 또는 별칭으로 시작된 실행 보기
<a name="view-version-alias-executions"></a>

Step Functions는 버전 또는 별칭으로 시작된 실행을 볼 수 있는 다음과 같은 방법을 제공합니다.

### API 작업 사용
<a name="view-executions-api-actions"></a>

[DescribeExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeExecution.html) 및 [ListExecutions](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ListExecutions.html) API 작업을 간접적으로 호출하여 버전이나 별칭과 연결된 모든 실행을 볼 수 있습니다. 이러한 API 작업은 실행을 시작하는 데 사용된 버전이나 별칭의 ARN을 반환합니다. 또한 이러한 작업은 실행 상태와 ARN을 포함한 기타 세부 정보도 반환합니다.

상태 시스템 별칭 ARN 또는 버전 ARN을 제공하여 특정 별칭이나 버전과 연결된 실행을 나열할 수도 있습니다.

다음은 *myFirstExecution*이라는 상태 머신 실행을 시작하는 데 사용된 별칭의 ARN을 보여 주는 [ListExecutions](https://docs.aws.amazon.com/step-functions/latest/apireference/API_ListExecutions.html) API 작업의 응답 예제입니다.

다음 코드 스니펫에서 *기울임꼴*로 표시된 텍스트는 리소스별 정보를 나타냅니다.

```
{
    "executions": [
        {
            "executionArn": "arn:aws:states:region:account-id:execution:myStateMachine:myFirstExecution",
            "stateMachineArn": "arn:aws:states:region:account-id:stateMachine:myStateMachine",
            "stateMachineAliasArn": "arn:aws:states:region:account-id:stateMachine:myStateMachine:PROD",
            "name": "myFirstExecution",
            "status": "SUCCEEDED",
            "startDate": "2023-04-20T23:07:09.477000+00:00",
            "stopDate": "2023-04-20T23:07:09.732000+00:00"
        }
    ]
}
```

### Step Functions 콘솔 사용
<a name="view-executions-console"></a>

[Step Functions](https://console.aws.amazon.com/states/home?region=us-east-1#/) 콘솔에서도 버전이나 별칭으로 시작된 실행을 볼 수 있습니다. 다음 절차에서는 특정 버전으로 시작된 실행을 보는 방법을 보여줍니다.

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 열고 [버전](concepts-state-machine-version.md#procedure-create-versions)을 게시했거나 [별칭](concepts-state-machine-alias.md#procedure-create-aliases)을 만든 기존 상태 시스템을 선택합니다. 이 예제에서는 특정 상태 시스템 버전으로 시작된 실행을 보는 방법을 보여줍니다.

1. **버전** 탭을 선택한 다음 **버전** 목록에서 버전을 선택합니다.
**작은 정보**  
속성 또는 값 상자별로 필터링하여 특정 버전을 검색합니다.

1. *버전 세부 정보 페이지*에서 선택한 버전으로 시작된 모든 진행 중인 상태 시스템 실행과 이전 상태 시스템 실행 목록을 확인할 수 있습니다.

다음 이미지에서는 *버전 세부 정보* 콘솔 페이지를 보여줍니다. 이 페이지에는 `MathAddDemo`라는 상태 시스템의 버전 *4*에서 시작된 실행이 나열됩니다. 또한 이 목록에는 `PROD`라는 별칭으로 시작된 실행도 표시됩니다. 이 별칭은 실행 트래픽을 버전 *4*로 라우팅했습니다.

![\[상태 시스템 버전 세부 정보 콘솔 페이지의 예시 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/view-version-executions.png)


### CloudWatch 지표 사용
<a name="view-executions-metrics"></a>

[Qualified ARN](#qualifiedARN)으로 시작하는 상태 시스템 실행마다 Step Functions는 현재 내보내는 지표와 동일한 이름 및 값을 가진 추가 지표를 내보냅니다. 이러한 추가 지표에는 실행을 시작하는 데 사용하는 버전 식별자 및 별칭 이름 각각에 대한 차원이 포함됩니다. 이러한 지표를 사용하면 버전 수준에서 상태 시스템 실행을 모니터링하고 롤백 시나리오가 필요한 시기를 결정할 수 있습니다. 이러한 지표를 기반으로 [Amazon CloudWatch 경보](procedure-cw-metrics.md#monitoring-using-cloudwatch-console-set-alarm)도 만들 수 있습니다.

Step Functions는 별칭 또는 버전으로 시작하는 실행에 대한 다음 지표를 내보냅니다.
+ `ExecutionTime`
+ `ExecutionsAborted`
+ `ExecutionsFailed`
+ `ExecutionsStarted`
+ `ExecutionsSucceeded`
+ `ExecutionsTimedOut `

버전 ARN으로 실행을 시작한 경우 Step Functions는 `StateMachineArn`을 사용하여 지표를 게시하고 `StateMachineArn` 및 `Version` 차원을 사용하여 두 번째 지표를 게시합니다.

별칭 ARN으로 실행을 시작한 경우 Step Functions는 다음 지표를 내보냅니다.
+ 정규화되지 않은 ARN 및 버전에 대한 지표 2개
+ `StateMachineArn` 및 `Alias` 차원이 포함된 지표

# 예: Step Functions의 별칭 및 버전 배포
<a name="example-alias-version-deployment"></a>

다음 카나리 배포 기법 예제에서는 AWS Command Line Interface를 사용하여 새 상태 시스템 버전을 배포하는 방법을 보여줍니다. 이 예시에서는 생성된 별칭이 실행 트래픽의 20%를 새 버전으로 라우팅합니다. 그런 다음 나머지 80%를 이전 버전으로 라우팅합니다. 새 상태 시스템 [버전](concepts-state-machine-version.md)을 배포하고 [별칭](concepts-state-machine-alias.md)으로 실행 트래픽을 전환하려면 다음 단계를 완료합니다.

1. 

**현재 상태 시스템 개정의 버전을 게시합니다.**  
 AWS CLI 에서 **publish-state-machine-version** 명령을 사용하여 `myStateMachine:`이라는 상태 시스템의 현재 개정에서 버전을 게시합니다.

   ```
   aws stepfunctions publish-state-machine-version --state-machine-arn arn:aws:states:region:account-id:stateMachine:myStateMachine
   ```

   응답은 게시한 버전의 `stateMachineVersionArn`을 반환합니다. 예를 들어 `arn:aws:states:region:account-id:stateMachine:myStateMachine:1`입니다.

1. 

**상태 시스템 버전을 가리키는 별칭을 만듭니다.**  
**create-state-machine-alias** 명령을 사용하여 `myStateMachine` 버전 1을 가리키는 `PROD`라는 별칭을 만듭니다.

   ```
   aws stepfunctions create-state-machine-alias --name PROD --routing-configuration "[{\"stateMachineVersionArn\":\"arn:aws:states:region:account-id:stateMachine:myStateMachine:1\",\"weight\":100}]"
   ```

1. 

**별칭으로 시작된 실행에서 올바르게 게시된 버전을 사용하는지 확인합니다.**  
**start-execution** 명령에 **PROD** 별칭의 ARN을 제공하여 `myStateMachine`의 새 실행을 시작합니다.

   ```
   aws stepfunctions start-execution 
     --state-machine-arn arn:aws:states:region:account-id:stateMachineAlias:myStateMachine:PROD
     --input "{}"
   ```

   [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) 요청에 상태 시스템 ARN을 제공하면 실행 시작 시 별칭에 지정된 버전 대신 최신 [revision](concepts-cd-aliasing-versioning.md#statemachinerev)의 상태 시스템이 사용됩니다.

1. 

**상태 시스템 정의를 업데이트하고 새 버전을 게시합니다.**  
`myStateMachine`을 업데이트하고 새 버전을 게시합니다. 이렇게 하려면 **update-state-machine** 명령의 선택적 `publish` 파라미터를 사용합니다.

   ```
   aws stepfunctions update-state-machine
       --state-machine-arn arn:aws:states:region:account-id:stateMachine:myStateMachine
       --definition $UPDATED_STATE_MACHINE_DEFINITION
       --publish
   ```

   응답에서 새 버전의 `stateMachineVersionArn`을 반환합니다. 예를 들어 `arn:aws:states:region:account-id:stateMachine:myStateMachine:2`입니다.

1. 

**두 버전을 모두 가리키도록 별칭을 업데이트하고 별칭의 [라우팅 구성](concepts-state-machine-alias.md#alias-routing-config)을 설정합니다.**  
**update-state-machine-alias** 명령을 사용하여 별칭 `PROD`의 라우팅 구성을 업데이트합니다. 실행 트래픽의 80%는 버전 1로 이동하고 나머지 20%는 버전 2로 이동하도록 별칭을 구성합니다.

   ```
   aws stepfunctions update-state-machine-alias --state-machine-alias-arn arn:aws:states:region:account-id:stateMachineAlias:myStateMachine:PROD --routing-configuration "[{\"stateMachineVersionArn\":\"arn:aws:states:region:account-id:stateMachine:myStateMachine:1\",\"weight\":80}, {\"stateMachineVersionArn\":\"arn:aws:states:region:account-id:stateMachine:myStateMachine:2\",\"weight\":20}]"
   ```

1. 

**버전 1을 버전 2로 바꿉니다.**  
새 상태 시스템 버전이 올바르게 작동하는지 확인한 후에 새 상태 시스템 버전을 배포할 수 있습니다. 이렇게 하려면 별칭을 다시 업데이트하여 실행 트래픽의 100%를 새 버전에 할당합니다.

   **update-state-machine-alias** 명령을 사용하여 별칭 `PROD`의 라우팅 구성을 버전 2의 100%로 설정합니다.

   ```
   aws stepfunctions update-state-machine-alias --state-machine-alias-arn arn:aws:states:region:account-id:stateMachineAlias:myStateMachine:PROD --routing-configuration "[{\"stateMachineVersionArn\":\"arn:aws:states:region:account-id:stateMachine:myStateMachine:2\",\"weight\":100}]"
   ```

**작은 정보**  
버전 2의 배포를 롤백하려면 트래픽의 100%가 새로 배포된 버전으로 이동하도록 별칭의 라우팅 구성을 편집합니다.  

```
aws stepfunctions update-state-machine-alias 
  --state-machine-alias-arn arn:aws:states:region:account-id:stateMachineAlias:myStateMachine:PROD 
  --routing-configuration "[{\"stateMachineVersionArn\":\"arn:aws:states:region:account-id:stateMachine:myStateMachine:1\",\"weight\":100}]"
```

버전과 별칭을 사용하여 다른 유형의 배포를 수행할 수 있습니다. 예를 들어 새 버전의 상태 시스템을 *순차적으로 배포*할 수 있습니다. 이렇게 하려면 새 버전을 가리키는 별칭의 라우팅 구성에서 가중치를 적용하는 비율을 점차 늘립니다.

버전과 별칭을 사용하여 *블루/그린 배포*를 수행할 수도 있습니다. 이렇게 하려면 상태 시스템의 현재 버전 1을 실행하는 `green` 별칭을 만듭니다. 그런 다음 새 버전(예: `2`)을 실행하는 또 다른 `blue` 별칭을 만듭니다. 새 버전을 테스트하려면 실행 트래픽을 `blue` 별칭으로 전송합니다. 새 버전이 올바르게 작동한다고 확신하면 새 버전을 가리키도록 `green` 별칭을 업데이트합니다.

# Step Functions에서 상태 시스템 버전 점진적 배포 수행
<a name="version-rolling-deployment"></a>

롤링 배포는 이전 버전의 애플리케이션을 새 버전의 애플리케이션으로 천천히 바꾸는 배포 전략입니다. 상태 시스템 버전 롤링 배포를 수행하려면 실행 트래픽 양을 점진적으로 늘리면서 새 버전으로 전송합니다. 트래픽 양과 증가 속도는 사용자가 구성하는 파라미터입니다.

다음 옵션 중 하나를 사용하여 버전 롤링 배포를 수행할 수 있습니다.
+ [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/) - 같은 상태 시스템 버전 2개를 가리키는 별칭을 만듭니다. 이 별칭의 경우 트래픽이 두 버전 간에 이동하도록 라우팅 구성을 구성합니다. 콘솔을 사용하여 버전을 출시하는 방법에 대한 자세한 내용은 [버전](concepts-state-machine-version.md) 및 [별칭](concepts-state-machine-alias.md) 섹션을 참조하세요.
+ **AWS CLI 및 SDK용 스크립트** - AWS CLI 또는 AWS SDK를 사용하여 쉘 스크립트를 만듭니다. 자세한 내용은 AWS CLI 및 AWS SDK 사용에 대한 다음 섹션을 참조하세요.
+ **AWS CloudFormation 템플릿** - `[AWS::StepFunctions::StateMachineVersion](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html)` 및 `[AWS::StepFunctions::StateMachineAlias](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html)` 리소스를 사용하여 여러 상태 시스템 버전을 게시하고 이러한 버전 중 하나 또는 두 개를 가리키는 별칭을 만듭니다.

## AWS CLI를 사용하여 새 상태 시스템 버전 배포
<a name="version-canary-deploy-cli"></a>

이 섹션의 예제 스크립트에서는 AWS CLI를 사용하여 트래픽을 이전 상태 시스템 버전에서 새 상태 시스템 버전으로 점진적으로 이동하는 방법을 보여줍니다. 이 예제 스크립트를 사용하거나 요구 사항에 따라 업데이트할 수 있습니다.

이 스크립트에서는 별칭을 사용하여 새 상태 시스템 버전을 배포하기 위한 카나리 배포를 보여줍니다. 다음 단계에서는 스크립트에서 수행하는 작업을 간략하게 설명합니다.

1. `publish_revision` 파라미터가 true로 설정되면 최신 [revision](concepts-cd-aliasing-versioning.md#statemachinerev)을 상태 시스템의 다음 버전으로 게시합니다. 배포가 성공하면 이 버전이 새로운 실시간 버전이 됩니다.

   `publish_revision` 파라미터를 false로 설정하면 스크립트는 마지막으로 게시된 상태 시스템 버전을 배포합니다.

1. 아직 존재하지 않으면 별칭을 만듭니다. 별칭이 존재하지 않으면 이 별칭의 모든 트래픽이 새 버전을 가리키도록 한 다음 스크립트를 종료합니다.

1. 별칭의 라우팅 구성을 업데이트하여 소량의 트래픽을 이전 버전에서 새 버전으로 이동합니다. `canary_percentage` 파라미터를 사용하여 이 canary 비율을 설정합니다.

1. 기본적으로 구성 가능한 CloudWatch 경보를 60초 간격으로 모니터링합니다. 이러한 경보 중 하나라도 발생하면 모든 트래픽이 이전 버전을 가리키도록 하여 배포를 즉시 롤백합니다.

   `alarm_polling_interval`에 정의된 시간 간격(초 단위)이 지난 후에 경보를 계속 모니터링합니다. `canary_interval_seconds`에 정의된 시간 간격이 경과할 때까지 계속 모니터링합니다.

1. `canary_interval_seconds` 중에 알람이 발생한 경우 모든 트래픽을 새 버전으로 이동합니다.

1. 새 버전이 성공적으로 배포되면 `history_max` 파라미터에 지정된 숫자보다 오래된 버전을 모두 삭제합니다.



```
#!/bin/bash
# 
# AWS StepFunctions example showing how to create a canary deployment with a
# State Machine Alias and versions.
# 
# Requirements: AWS CLI installed and credentials configured.
# 
# A canary deployment deploys the new version alongside the old version, while
# routing only a small fraction of the overall traffic to the new version to
# see if there are any errors. Only once the new version has cleared a testing
# period will it start receiving 100% of traffic.
# 
# For a Blue/Green or All at Once style deployment, you can set the
# canary_percentage to 100. The script will immediately shift 100% of traffic
# to the new version, but keep on monitoring the alarms (if any) during the
# canary_interval_seconds time interval. If any alarms raise during this period,
# the script will automatically rollback to the previous version.
# 
# Step Functions allows you to keep a maximum of 1000 versions in version history
# for a state machine. This script has a version history deletion mechanism at
# the end, where it will delete any versions older than the limit specified.
# 
# For an example that also demonstrates linear (or rolling) deployments, see the following: 
# https://github.com/aws-samples/aws-stepfunctions-examples/blob/main/gradual-deploy/sfndeploy.py

set -euo pipefail

# ******************************************************************************
# you can safely change the variables in this block to your values
state_machine_name="my-state-machine"
alias_name="alias-1"
region="us-east-1"

# array of cloudwatch alarms to poll during the test period.
# to disable alarm checking, set alarm_names=()
alarm_names=("alarm1" "alarm name with a space")

# true to publish the current revision as the next version before deploy.
# false to deploy the latest version from the state machine's version history.
publish_revision=true

# true to force routing configuration update even if the current routing
# for the alias does not have a 100% routing config.
# false will abandon deploy attempt if current routing config not 100% to a
# single version.
# Be careful when you combine this flag with publish_revision - if you just
# rerun the script you might deploy the newly published revision from the
# previous run.
force=false

# percentage of traffic to route to the new version during the test period
canary_percentage=10

# how many seconds the canary deployment lasts before full deploy to 100%
canary_interval_seconds=300

# how often to poll the alarms
alarm_polling_interval=60

# how many versions to keep in history. delete versions prior to this.
# set to 0 to disable old version history deletion.
history_max=0
# ******************************************************************************

#######################################
# Update alias routing configuration.
# 
# If you don't specify version 2 details, will only create 1 routing entry. In
# this case the routing entry weight must be 100.
# 
# Globals:
#   alias_arn
# Arguments:
#   1. version 1 arn
#   2. version 1 weight
#   3. version 2 arn (optional)
#   4. version 2 weight (optional)
#######################################
function update_routing() {
  if [[ $# -eq 2 ]]; then
    local routing_config="[{\"stateMachineVersionArn\": \"$1\", \"weight\":$2}]"
  elif [[ $# -eq 4 ]]; then
    local routing_config="[{\"stateMachineVersionArn\": \"$1\", \"weight\":$2}, {\"stateMachineVersionArn\": \"$3\", \"weight\":$4}]"
  else
    echo "You have to call update_routing with either 2 or 4 input arguments." >&2
    exit 1
  fi
  
  ${aws} update-state-machine-alias --state-machine-alias-arn ${alias_arn} --routing-configuration "${routing_config}"
}

# ******************************************************************************
# pre-run validation
if [[ (("${#alarm_names[@]}" -gt 0)) ]]; then
  alarm_exists_count=$(aws cloudwatch describe-alarms --alarm-names "${alarm_names[@]}" --alarm-types "CompositeAlarm" "MetricAlarm" --query "length([MetricAlarms, CompositeAlarms][])" --output text)

  if [[ (("${#alarm_names[@]}" -ne "${alarm_exists_count}")) ]]; then
    echo All of the alarms to monitor do not exist in CloudWatch: $(IFS=,; echo "${alarm_names[*]}") >&2
    echo Only the following alarm names exist in CloudWatch:
    aws cloudwatch describe-alarms --alarm-names "${alarm_names[@]}" --alarm-types "CompositeAlarm" "MetricAlarm" --query "join(', ', [MetricAlarms, CompositeAlarms][].AlarmName)" --output text
    exit 1
  fi
fi

if [[ (("${history_max}" -gt 0)) && (("${history_max}" -lt 2)) ]]; then
  echo The minimum value for history_max is 2. This is the minimum number of older state machine versions to be able to rollback in the future. >&2
  exit 1
fi
# ******************************************************************************
# main block follows

account_id=$(aws sts get-caller-identity --query Account --output text)

sm_arn="arn:aws:states:${region}:${account_id}:stateMachine:${state_machine_name}"

# the aws command we'll be invoking a lot throughout.
aws="aws stepfunctions"

# promote the latest revision to the next version
if [[ "${publish_revision}" = true ]]; then
  new_version=$(${aws} publish-state-machine-version --state-machine-arn=$sm_arn --query stateMachineVersionArn --output text)
  echo Published the current revision of state machine as the next version with arn: ${new_version}
else
  new_version=$(${aws} list-state-machine-versions --state-machine-arn ${sm_arn} --max-results 1 --query "stateMachineVersions[0].stateMachineVersionArn" --output text)
  echo "Since publish_revision is false, using the latest version from the state machine's version history: ${new_version}"
fi

# find the alias if it exists
alias_arn_expected="${sm_arn}:${alias_name}"
alias_arn=$(${aws} list-state-machine-aliases --state-machine-arn ${sm_arn} --query "stateMachineAliases[?stateMachineAliasArn==\`${alias_arn_expected}\`].stateMachineAliasArn" --output text)

if [[ "${alias_arn_expected}" == "${alias_arn}" ]]; then
  echo Found alias ${alias_arn}

  echo Current routing configuration is:
  ${aws} describe-state-machine-alias --state-machine-alias-arn "${alias_arn}" --query routingConfiguration
else
  echo Alias does not exist. Creating alias ${alias_arn_expected} and routing 100% traffic to new version ${new_version}
  
  ${aws} create-state-machine-alias --name "${alias_name}" --routing-configuration "[{\"stateMachineVersionArn\": \"${new_version}\", \"weight\":100}]"

  echo Done!
  exit 0
fi

# find the version to which the alias currently points (the current live version)
old_version=$(${aws} describe-state-machine-alias --state-machine-alias-arn $alias_arn --query "routingConfiguration[?weight==\`100\`].stateMachineVersionArn" --output text)

if [[ -z "${old_version}" ]]; then
  if [[ "${force}" = true ]]; then
    echo Force setting is true. Will force update to routing config for alias to point 100% to new version.
    update_routing "${new_version}" 100
    
    echo Alias ${alias_arn} now pointing 100% to ${new_version}.
    echo Done!
    exit 0
  else
    echo Alias ${alias_arn} does not have a routing config entry with 100% of the traffic. This means there might be a deploy in progress, so not starting another deploy at this time. >&2
    exit 1
  fi
fi

if [[ "${old_version}" == "${new_version}" ]]; then
  echo The alias already points to this version. No update necessary.
  exit 0
fi

echo Switching ${canary_percentage}% to new version ${new_version}
(( old_weight = 100 - ${canary_percentage} ))
update_routing "${new_version}" ${canary_percentage} "${old_version}" ${old_weight}

echo New version receiving ${canary_percentage}% of traffic.
echo Old version ${old_version} is still receiving ${old_weight}%.

if [[ ${#alarm_names[@]} -eq 0 ]]; then
  echo No alarm_names set. Skipping cloudwatch monitoring.
  echo Will sleep for ${canary_interval_seconds} seconds before routing 100% to new version.
  sleep ${canary_interval_seconds}
  echo Canary period complete. Switching 100% of traffic to new version...
else
  echo Checking if alarms fire for the next ${canary_interval_seconds} seconds.

  (( total_wait = canary_interval_seconds + $(date +%s) ))

  now=$(date +%s)
  while [[ ((${now} -lt ${total_wait})) ]]; do
    alarm_result=$(aws cloudwatch describe-alarms --alarm-names "${alarm_names[@]}" --state-value ALARM --alarm-types "CompositeAlarm" "MetricAlarm" --query "join(', ', [MetricAlarms, CompositeAlarms][].AlarmName)" --output text)

    if [[ ! -z "${alarm_result}" ]]; then
      echo The following alarms are in ALARM state: ${alarm_result}. Rolling back deploy. >&2
      update_routing "${old_version}" 100

      echo Rolled back to ${old_version}
      exit 1
    fi
  
    echo Monitoring alarms...no alarms have triggered.
    sleep ${alarm_polling_interval}
    now=$(date +%s)
  done

  echo No alarms detected during canary period. Switching 100% of traffic to new version...
fi

update_routing "${new_version}" 100

echo Version ${new_version} is now receiving 100% of traffic.

if [[ (("${history_max}" -eq 0 ))]]; then
  echo Version History deletion is disabled. Remember to prune your history, the default limit is 1000 versions.
  echo Done!
  exit 0
fi

echo Keep the last ${history_max} versions. Deleting any versions older than that...

# the results are sorted in descending order of the version creation time
version_history=$(${aws} list-state-machine-versions --state-machine-arn ${sm_arn} --max-results 1000 --query "join(\`\"\\n\"\`, stateMachineVersions[].stateMachineVersionArn)" --output text)

counter=0

while read line; do
  ((counter=${counter} + 1))

  if [[ (( ${counter} -gt ${history_max})) ]]; then
    echo Deleting old version ${line}
    ${aws} delete-state-machine-version --state-machine-version-arn ${line}
  fi
done <<< "${version_history}"

echo Done!
```

## AWS SDK를 사용하여 새 상태 시스템 버전 배포
<a name="version-deploy-sdk"></a>

[aws-stepfunctions-examples](https://github.com/aws-samples/aws-stepfunctions-examples/tree/main/gradual-deploy)의 예제 스크립트에서는 Python용 AWS SDK를 사용하여 트래픽을 점진적으로 상태 시스템의 이전 버전에서 새 버전으로 이동하는 방법을 보여줍니다. 이 예제 스크립트를 사용하거나 요구 사항에 따라 업데이트할 수 있습니다.

스크립트에서는 다음과 같은 배포 전략을 보여줍니다.
+ **Canary**: 트래픽이 두 증분으로 나뉘어 이동합니다.

  첫 번째 증분에서는 작은 비율의 트래픽(예: 10%)이 새 버전으로 이동합니다. 두 번째 증분에서는 지정된 시간 간격(초)이 초과되기 전에 남은 트래픽이 새 버전으로 이동합니다. 지정된 시간 간격 동안 CloudWatch 경보가 발생하지 않은 경우에만 남은 트래픽이 새 버전으로 전환됩니다.
+  **선형 또는 롤링** - 각 증분 사이의 시간(초)이 같도록 하여 동일한 증분으로 트래픽을 새 버전으로 이동합니다.

  예를 들어 증분 비율을 **600**초 `--interval`을 사용하여 **20**으로 지정하면 이 배포는 새 버전에서 모든 트래픽을 수신할 때까지 600초 간격으로 트래픽을 20%씩 증가합니다.

  CloudWatch 경보가 발생하면 이 배포는 즉시 새 버전을 롤백합니다.
+ **한 번에 모두 또는 블루/그린** - 모든 트래픽을 새 버전으로 즉시 이동합니다. 이 배포는 새 버전을 모니터링하고 CloudWatch 경보가 발생하면 자동으로 이전 버전으로 롤백합니다.

## AWS CloudFormation을 사용하여 새 상태 시스템 버전 배포
<a name="version-deploy-cfn"></a>

다음 CloudFormation 템플릿 예제에서는 `MyStateMachine` 상태 시스템의 두 버전을 게시합니다. 이러한 두 버전을 모두 가리키는 `PROD` 별칭을 만든 다음 버전 `2`를 배포합니다.

이 예제에서는 이 버전에서 모든 트래픽을 수신할 때까지 트래픽의 10%가 5분 간격으로 버전 `2`로 이동합니다. 이 예제에서도 CloudWatch 알람을 설정하는 방법을 보여줍니다. 설정한 경보 중 하나라도 이 `ALARM` 상태로 전환되면 배포가 실패하고 즉시 롤백됩니다.

```
MyStateMachine:
  Type: AWS::StepFunctions::StateMachine
  Properties:
    Type: STANDARD
    StateMachineName: MyStateMachine
    RoleArn: arn:aws:iam::account-id:role/myIamRole
    Definition:
      StartAt: PassState
      States:
        PassState:
          Type: Pass
          Result: Result
          End: true

MyStateMachineVersionA:
  Type: AWS::StepFunctions::StateMachineVersion
  Properties:
    Description: Version 1
    StateMachineArn: !Ref MyStateMachine

MyStateMachineVersionB:
  Type: AWS::StepFunctions::StateMachineVersion
  Properties:
    Description: Version 2
    StateMachineArn: !Ref MyStateMachine

PROD:
  Type: AWS::StepFunctions::StateMachineAlias
  Properties:
    Name: PROD
    Description: The PROD state machine alias taking production traffic.
    DeploymentPreference:
      StateMachineVersionArn: !Ref MyStateMachineVersionB
      Type: LINEAR
      Percentage: 10
      Interval: 5
      Alarms:
        # A list of alarms that you want to monitor. If any of these alarms trigger, rollback the deployment immediately by pointing 100 percent of traffic to the previous version.
        - !Ref CloudWatchAlarm1
        - !Ref CloudWatchAlarm2
```