

# 3단계: DynamoDB 서비스를 사용한 프로덕션 내 배포
<a name="TicTacToe.Phase3"></a>

**Topics**
+ [3.1: Amazon EC2의 IAM 역할 생성](#TicTacToe.DeployInProd.IAMCreateRole)
+ [3.2: Amazon DynamoDB에서 Games 테이블 생성](#TicTacToe.DeployInProd.CreateTable)
+ [3.3: Tic-Tac-Toe 애플리케이션 코드 번들링 및 배포](#TicTacToe.DeployInProd.IAMBundleDeployCode)
+ [3.4: AWS Elastic Beanstalk 환경 설정](#TicTacToe.DeployInProd.SetUpElasticBeanstalk)

위 섹션에서는 DynamoDB Local을 사용하여 로컬 컴퓨터에 Tic-Tac-Toe 게임 애플리케이션을 배포 및 테스트했습니다. 이제 다음과 같이 프로덕션에 애플리케이션을 배포합니다.
+ 웹 애플리케이션과 서비스의 배포 및 규모 조정을 위한 간편한 서비스인 AWS Elastic Beanstalk를 사용하여 애플리케이션을 배포합니다. 자세한 내용은 [AWS Elastic Beanstalk에 Flask 애플리케이션 배포](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html)를 참조하세요.

  Elastic Beanstalk에서 하나 이상의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 시작하면 Tic-Tac-Toe 애플리케이션을 실행할 Elastic Beanstalk를 통해 해당 인스턴스를 구성합니다.
+ Amazon DynamoDB 서비스를 사용하여 컴퓨터에 로컬로가 아니라 AWS에 있는 `Games` 테이블을 만듭니다.

또한 권한을 구성해야 합니다. DynamoDB의 `Games` 테이블과 같이 사용자가 만드는 모든 AWS 리소스는 기본적으로 프라이빗입니다. 리소스 소유자, 즉, `Games` 테이블을 만든 AWS 계정만 이 테이블에 액세스할 수 있습니다. 따라서, 사용자의 Tic-Tac-Toe 애플리케이션은 기본적으로 `Games` 테이블을 업데이트할 수 없습니다.

필요한 권한을 부여하려면 AWS Identity and Access Management(IAM) 역할을 만들고 이 역할에 `Games` 테이블 액세스 권한을 부여합니다. Amazon EC2 인스턴스가 먼저 이 역할을 맡습니다. 그 응답으로 AWS는 Amazon EC2 인스턴스가 Tic-Tac-Toe 애플리케이션을 대신하여 `Games` 테이블을 업데이트하는 데 사용할 수 있는 임시 보안 자격 증명을 반환합니다. Elastic Beanstalk 애플리케이션을 구성할 때 Amazon EC2 인스턴스가 맡을 수 있는 IAM 역할을 지정합니다. IAM 역할에 대한 자세한 내용은 **Amazon EC2 사용 설명서의 [Amazon EC2의 IAM 역할](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)을 참조하세요.

**참고**  
Tic-Tac-Toe 애플리케이션의 Amazon EC2 인스턴스를 만들기 전에 우선 Elastic Beanstalk이 인스턴스를 만들 AWS 리전을 결정해야 합니다. Elastic Beanstalk 애플리케이션을 만든 다음에는 구성 파일에 동일한 리전 이름과 엔드포인트를 입력해야 합니다. Tic-Tac-Toe 애플리케이션은 이 파일의 정보를 사용하여 `Games` 테이블을 만들고 특정 AWS 리전의 후속 요청을 전송합니다. Elastic Beanstalk이 시작하는 DynamoDB `Games` 테이블 및 Amazon EC2 인스턴스는 동일한 리전에 있어야 합니다. 사용 가능한 리전의 목록은 **Amazon Web Services 일반 참조에서 [Amazon DynamoDB](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region)를 참조하세요.

프로덕션에 Tic-Tac-Toe 애플리케이션을 배포하는 단계를 요약하면 다음과 같습니다.

1. IAM 서비스를 사용하여 IAM 역할을 만듭니다. 이 역할에 정책을 연결하여 `Games` 테이블에 액세스하는 DynamoDB 작업을 위한 권한을 부여합니다.

1. Tic-Tac-Toe 애플리케이션 코드와 구성 파일의 번들을 생성한 후 `.zip` 파일을 만듭니다. 이 `.zip` 파일을 사용하여 서버에 배포할 Elastic Beanstalk에 Tic-Tac-Toe 애플리케이션 코드를 제공합니다. 번들 생성에 대한 자세한 *AWS Elastic Beanstalk 개발자 안내서*에서 [애플리케이션 소스 번들 생성](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deployment.source.html)을 참조하세요.

   구성 파일(`beanstalk.config`)에 AWS 리전과 엔드포인트 정보를 입력합니다. Tic-Tac-Toe 애플리케이션은 이 정보를 사용하여 연결할 DynamoDB 리전을 확인합니다.

1. Elastic Beanstalk 환경을 설정합니다. Elastic Beanstalk이 Amazon EC2 인스턴스를 실행하고 해당 인스턴스에 Tic-Tac-Toe 애플리케이션 번들을 배포합니다. Elastic Beanstalk 환경이 준비되면 `CONFIG_FILE` 환경 변수를 추가하여 구성 파일 이름을 입력합니다.

1. DynamoDB 테이블을 생성합니다. Amazon DynamoDB 서비스를 사용하여 컴퓨터에서 로컬로가 아니라 AWS에 `Games` 테이블을 생성합니다. 이 테이블에는 문자열 형식의 `GameId` 파티션 키로 구성된 단순 기본 키가 있습니다.

1. 프로덕션에서 게임을 테스트합니다.

## 3.1: Amazon EC2의 IAM 역할 생성
<a name="TicTacToe.DeployInProd.IAMCreateRole"></a>

**Amazon EC2** 유형의 IAM 역할을 만들면 Tic-Tac-Toe 애플리케이션을 실행 중인 Amazon EC2 인스턴스가 올바른 IAM 역할을 맡고 `Games` 테이블에 액세스하기 위한 애플리케이션 요청을 보낼 수 있습니다. 역할을 만들 때에는 [**Custom Policy(사용자 지정 정책)**] 옵션을 선택하고 다음 정책을 복사하여 붙여 넣습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Action":[
            "dynamodb:ListTables"
         ],
         "Effect":"Allow",
         "Resource":"*"
      },
      {
         "Action":[
            "dynamodb:*"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:dynamodb:us-west-2:922852403271:table/Games",
            "arn:aws:dynamodb:us-west-2:922852403271:table/Games/index/*"
         ]
      }
   ]
}
```

------

자세한 지침은 *IAM 사용 설명서*의 [AWS 서비스에 대한 역할 생성(AWS Management Console)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

## 3.2: Amazon DynamoDB에서 Games 테이블 생성
<a name="TicTacToe.DeployInProd.CreateTable"></a>

DynamoDB의 `Games` 테이블은 게임 데이터를 저장합니다. 테이블이 존재하지 않을 경우, 애플리케이션이 해당 테이블을 만듭니다. 이 예제에서는 애플리케이션이 `Games` 테이블을 만들도록 합니다.

## 3.3: Tic-Tac-Toe 애플리케이션 코드 번들링 및 배포
<a name="TicTacToe.DeployInProd.IAMBundleDeployCode"></a>

이 예제의 단계를 따른 경우 이미 Tic-Tac-Toe 애플리케이션 다운로드를 완료한 상태여야 합니다. 그렇지 않을 경우 애플리케이션을 다운로드하고 로컬 컴퓨터에 모든 파일을 추출하세요. 지침은 [1단계: 로컬 배포 및 테스트](TicTacToe.Phase1.md) 단원을 참조하세요.

모든 파일을 추출하면 `code` 폴더가 나타납니다. 이 폴더를 Elastic Beanstalk에 전달하려면 이 폴더의 콘텐츠를 `.zip` 파일로 번들링해야 합니다. 우선 해당 폴더에 구성 파일을 추가합니다. 애플리케이션이 리전 및 엔드포인트 정보를 사용하여 지정된 리전에 DynamoDB 테이블을 만들고, 지정된 엔드포인트를 사용하여 후속 테이블 작업 요청을 보냅니다.

1. Tic-Tac-Toe 애플리케이션을 다운로드한 폴더로 전환합니다.

1. 애플리케이션 루트 폴더에서 다음 콘텐츠가 포함된 텍스트 파일을 만들고 이름을 `beanstalk.config`로 지정합니다.

   ```
   [dynamodb]
   region={{<AWS region>}}
   endpoint={{<DynamoDB endpoint>}}
   ```

   예를 들어 다음과 같은 콘텐츠를 사용할 수 있습니다.

   ```
   [dynamodb]
   region=us-west-2
   endpoint=dynamodb.us-west-2.amazonaws.com
   ```

   사용 가능한 리전 목록은 *Amazon Web Services 일반 참조*의 [Amazon DynamoDB](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region)를 참조하세요.
**중요**  
구성 파일에 지정된 리전은 Tic-Tac-Toe 애플리케이션이 DynamoDB에 `Games` 테이블을 만드는 위치입니다. 다음 단원에서 설명하는 Elastic Beanstalk 애플리케이션을 동일한 리전에 만들어야 합니다.
**참고**  
Elastic Beanstalk 애플리케이션을 만들면 환경 시작을 요청하고 환경 유형을 선택할 수 있습니다. Tic-Tac-Toe 예제 애플리케이션을 테스트하려면 [**단일 인스턴스**] 환경 유형을 선택하여 아래 항목을 생략하고 다음 단계로 건너뛸 수 있습니다.  
하지만 [**로드 밸런싱, 자동 조정**] 환경 유형은 가용성과 확장성이 높은 환경을 제공합니다. 다른 애플리케이션을 만들고 배포할 경우 이러한 환경을 사용하는 것이 좋습니다. 이 환경 유형을 선택할 경우, 다음과 같이 UUID를 만들고 구성 파일에 추가해야 합니다.  

   ```
   [dynamodb]
   region=us-west-2
   endpoint=dynamodb.us-west-2.amazonaws.com
   [flask]
   secret_key= 284e784d-1a25-4a19-92bf-8eeb7a9example
   ```
클라이언트-서버 통신에서 서버가 응답을 보내면 보안상의 이유로 서버가 서명된 쿠키를 보내고 클라이언트는 다음 요청 시 이 쿠키를 다시 서버로 보냅니다. 서버가 한 대인 경우 서버가 시작될 때 로컬에서 암호화 키를 만들 수 있습니다. 서버가 여러 대일 경우 모두 동일한 암호화 키를 알아야 합니다. 그렇지 않으면 피어 서버가 설정한 쿠키를 읽을 수 없습니다. 구성 파일에 `secret_key`를 추가하면 모든 서버가 이 암호화 키를 사용하도록 알릴 수 있습니다.

1. 애플리케이션 루트 폴더의 내용(`beanstalk.config` 파일 포함)을 압축합니다(예: `TicTacToe.zip`).

1. `.zip` 파일을 Amazon Simple Storage Service(Amazon S3) 버킷에 업로드합니다. 다음 단원에서는 이 `.zip` 파일을 Elastic Beanstalk에 제공하여 한 서버 또는 여러 서버에 업로드합니다.

   Amazon S3 버킷에 업로드하는 방법에 관한 지침은 *Amazon Simple Storage Service 사용 설명서*에서 [버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html) 및 [버킷에 객체 추가](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html) 섹션을 참조하세요.

## 3.4: AWS Elastic Beanstalk 환경 설정
<a name="TicTacToe.DeployInProd.SetUpElasticBeanstalk"></a>

이 단계에서는 환경을 포함한 구성 요소의 컬렉션인 Elastic Beanstalk 애플리케이션을 만듭니다. 이 예제에서는 하나의 Amazon EC2 인스턴스를 시작하여 Tic-Tac-Toe 애플리케이션을 배포 및 실행합니다.

1. 다음 사용자 지정 URL을 입력하여 Elastic Beanstalk 콘솔을 설정하고 환경을 설정합니다.

   ```
   https://console.aws.amazon.com/elasticbeanstalk/?region={{<AWS-Region>}}#/newApplication
   ?applicationName=TicTacToe{{your-name}}
   &solutionStackName=Python
   &sourceBundleUrl=https://s3.amazonaws.com/{{<bucket-name>}}/{{TicTacToe.zip}}
   &environmentType=SingleInstance
   &instanceType=t1.micro
   ```

   사용자 지정 URL에 대한 자세한 내용은 *AWS Elastic Beanstalk 개발자 안내서*에서 [Launch Now URL 생성](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/launch-now-url.html) 단원을 참조하세요. URL에 대해 다음 사항을 참조하세요.
   + AWS 리전 이름(구성 파일에 입력한 이름과 동일), Amazon S3 버킷 이름, 객체 이름을 제공해야 합니다.
   + URL은 테스트를 위해 [**SingleInstance**] 환경 유형과 `t1.micro` 인스턴스 유형을 요청합니다.
   + 애플리케이션 이름은 고유해야 합니다. 따라서 이전 URL에서 `applicationName` 앞에 사용자 이름을 추가하는 것이 좋습니다.

   이렇게 하면 Elastic Beanstalk 콘솔이 열리며 로그인이 필요한 경우도 있습니다.

1. Elastic Beanstalk 콘솔에서 [**Review and Launch**]를 선택한 다음 [**Launch**]를 선택합니다.

1. 나중에 참조할 수 있도록 URL을 기록합니다. 이 URL에서 Tic-Tac-Toe 애플리케이션 홈 페이지가 열립니다.  
![홈 페이지에 생성 중인 환경을 보여 주는 애플리케이션 스크린샷입니다.](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-50.png)

1. Tic-Tac-Toe 애플리케이션이 구성 파일의 위치를 알 수 있도록 구성합니다.

   Elastic Beanstalk가 애플리케이션을 만들면 [**Configuration**]을 선택합니다.

   1. 다음 스크린샷과 같이 [**Software Configuration**] 옆에 있는 기어 모양 아이콘을 선택합니다.  
![소프트웨어 구성 옆에 기어 아이콘을 보여 주는 Tic-Tac-Toe 애플리케이션 스크린샷입니다.](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-60.png)

   1. [**Environment Properties**] 섹션의 끝부분에서 **CONFIG\_FILE** 및 해당 값 **beanstalk.config**를 입력한 다음 [**Save**]를 선택합니다.

      이 환경 업데이트가 완료되는 데 몇 분이 소요될 수 있습니다.  
![환경 속성 섹션을 보여 주는 애플리케이션 스크린샷입니다.](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-70.png)

   업데이트가 완료되면 게임을 플레이할 수 있습니다.

1. 다음 예제와 같이 브라우저에 이전 단계에서 복사한 URL을 입력합니다.

   ```
   http://{{<pen-name>}}.elasticbeanstalk.com
   ```

   그러면 애플리케이션 홈 페이지가 열립니다.  
![생성 버튼, 초대장, 진행 중인 게임 및 최근 기록을 보여 주는 애플리케이션 홈 페이지의 스크린샷입니다.](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-10.png)

1. testuser1로 로그인하고 [**CREATE**]를 선택하여 새 Tic-Tac-Toe 게임을 시작합니다.

1. **Choose an Opponent(상대방 선택)** 상자에 **testuser2**를 입력합니다.  
![상대방 상자의 선택을 보여 주는 애플리케이션 스크린샷입니다.](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-20.png)

1. 다른 브라우저 창을 엽니다.

   동일한 사용자로 로그인되지 않도록 브라우저 창의 모든 쿠키를 지웠는지 반드시 확인하세요.

1. 다음 예제와 같이 동일한 URL을 입력하여 애플리케이션 홈 페이지를 엽니다.

   ```
   http://{{<env-name>}}.elasticbeanstalk.com
   ```

1. testuser2로 로그인합니다.

1. 보류 중인 초대 목록에 있는 testuser1의 초대에 대해 [**accept**]를 선택합니다.  
![초대 목록의 testuser1 초대를 보여 주는 애플리케이션 스크린샷입니다.](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-30.png)

1. 이제 게임 페이지가 나타납니다.  
![빈 tic-tac-toe 그리드를 보여 주는 애플리케이션 스크린샷입니다.](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-40.png)

   testuser1 및 testuser2 모두 게임을 플레이할 수 있습니다. 동작이 일어날 때마다 애플리케이션 `Games` 테이블의 해당 항목에 저장합니다.