[JAWS-UG CLI] CodeDeploy #1 アプリケーション、デプロイメントグループの作成

AWS CLIを利用して、CodeDeploy上にアプリケーションを作成します。


前提条件
========


CodeDeployへの権限
------------------

Code Deployに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.2

```bash:コマンド:
aws --version
```

```text:結果(例):
         aws-cli/1.11.2 Python/2.7.11 Darwin/15.6.0 botocore/1.4.60
```

   バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


変数の確認
----------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)
               Name                    Value             Type    Location
               ----                    -----             ----    --------
            profile         iamFull-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
         access_key     ****************XXXX shared-credentials-file
         secret_key     ****************XXXX shared-credentials-file
             region                         us-east-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```bash:変数の設定:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


1. 事前作業
===========


1.1. アプリケーション名の決定
-----------------------------

```bash:変数の設定:
CODED_APP_NAME="handson-app-$(date +%Y%m%d)" \
        && echo ${CODED_APP_NAME}
```

同名のアプリケーションが存在しないことを確認します。

```bash:コマンド:
aws deploy get-application \
        --application-name ${CODED_APP_NAME}
```

```text:結果(例):
      An error occurred (ApplicationDoesNotExistException) when calling the GetApplication operation: Applications not found for XXXXXXXXXXXX
```


1.2. サービルロールの指定
-------------------------

```bash:変数の設定:
IAM_ROLE_NAME='CodeDeployAssumeRole'
```

```bash:コマンド:
IAM_ROLE_ARN=$( \
        aws iam get-role \
          --role-name ${IAM_ROLE_NAME} \
          --query 'Role.Arn' \
          --output text \
) \
        && echo ${IAM_ROLE_ARN}
```

```text:結果(例):
      arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployAssumeRole
```


2. アプリケーションの作成
=========================


2.1. アプリケーションの作成
---------------------------

```bash:変数の確認
cat << ETX

        CODED_APP_NAME: ${CODED_APP_NAME}

ETX
```

```bash:コマンド:
aws deploy create-application \
        --application-name ${CODED_APP_NAME}
```

```json:結果(例):
      {
        "applicationId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
```


2.2. アプリケーションの一覧
---------------------------

```bash:コマンド:
aws deploy list-applications 
```

```json:結果(例):
      {
        "applications": [
          "handson-app-20161010"
        ]
      }
```


2.3. アプリケーションの確認
---------------------------

```bash:コマンド:
aws deploy get-application \
        --application-name ${CODED_APP_NAME}
```

```json:結果(例):
      {
        "application": {
          "applicationName": "handson-app-20161010",
          "linkedToGitHub": false,
          "applicationId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "createTime": 1234567890.123
        }
      }
```


3. デプロイメントグループの作成
===============================


3.1. デプロイメントグループ名の決定
-----------------------------------

```bash:変数の設定
CODED_DEPLOY_GROUP_NAME="${CODED_APP_NAME}-deployment-group" \
        && echo ${CODED_DEPLOY_GROUP_NAME}
```

同名のデプロイメントグループが存在しないことを確認します。

```bash:コマンド:
aws deploy get-deployment-group \
        --application-name ${CODED_APP_NAME} \
        --deployment-group-name ${CODED_DEPLOY_GROUP_NAME}
```

```text:結果(例):
      An error occurred (DeploymentGroupDoesNotExistException) when calling the GetDeploymentGroup operation: No Deployment Group found for name: MyDemoDeploymentGroup
```


3.2. デプロイメント設定の確認
-----------------------------

```bash:コマンド:
aws deploy list-deployment-configs 
```

```json:結果(例):
      {
        "deploymentConfigsList": [
          "CodeDeployDefault.OneAtATime",
          "CodeDeployDefault.AllAtOnce",
          "CodeDeployDefault.HalfAtATime"
        ]
      }
```

```bash:変数の設定
CODED_DEPLOY_CONFIG_NAME='CodeDeployDefault.OneAtATime'
```

```bash:コマンド:
aws deploy get-deployment-config \
        --deployment-config-name ${CODED_DEPLOY_CONFIG_NAME}
```

```json:結果(例):
      {
        "deploymentConfigInfo": {
          "deploymentConfigId": "00000000-0000-0000-0000-000000000001",
          "minimumHealthyHosts": {
              "type": "MOST_CONCURRENCY",
              "value": 1
          },
          "deploymentConfigName": "CodeDeployDefault.OneAtATime"
        }
      }
```


3.3. EC2タグフィルターの指定
----------------------------

```bash:変数の設定
EC2_TAG_KEY='Name'
      EC2_TAG_VALUE='MyCodePipelineDemo'
```

```bash:変数の設定
EC2_TAG_FILTER="Key=${EC2_TAG_KEY},Value=${EC2_TAG_VALUE},Type=KEY_AND_VALUE" \
        && echo ${EC2_TAG_FILTER}
```


3.3. デプロイメントグループの作成
---------------------------------

```bash:変数の確認
cat << ETX

        CODED_APP_NAME:           ${CODED_APP_NAME}
        CODED_DEPLOY_GROUP_NAME:  ${CODED_DEPLOY_GROUP_NAME}
        CODED_DEPLOY_CONFIG_NAME: ${CODED_DEPLOY_CONFIG_NAME}
        IAM_ROLE_ARN:             ${IAM_ROLE_ARN}
        EC2_TAG_FILTER:           ${EC2_TAG_FILTER}

ETX
```

```bash:コマンド:
aws deploy create-deployment-group \
        --application-name ${CODED_APP_NAME} \
        --deployment-group-name ${CODED_DEPLOY_GROUP_NAME} \
        --deployment-config-name ${CODED_DEPLOY_CONFIG_NAME} \
        --service-role-arn ${IAM_ROLE_ARN} \
        --ec2-tag-filters ${EC2_TAG_FILTER}
```

```json:結果(例):
      {
        "deploymentGroupId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
```


3.4. デプロイメントグループの一覧
---------------------------------

```bash:コマンド:
aws deploy list-deployment-groups \
        --application-name ${CODED_APP_NAME}
```

```json:結果(例):
      {
        "applicationName": "handson-app-20161010",
        "deploymentGroups": [
          "MyDemoDeploymentGroup"
        ]
      }
```


3.5. デプロイメントグループの確認
---------------------------------

```bash:コマンド:
aws deploy get-deployment-group \
        --application-name ${CODED_APP_NAME} \
        --deployment-group-name ${CODED_DEPLOY_GROUP_NAME}
```

```json:結果(例):
      {
        "deploymentGroupInfo": {
          "applicationName": "handson-app-20161010",
          "deploymentGroupId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "deploymentConfigName": "CodeDeployDefault.OneAtATime",
          "autoScalingGroups": [],
          "ec2TagFilters": [
              {
                  "Type": "KEY_AND_VALUE",
                  "Value": "MyCodePipelineDemo",
                  "Key": "Name"
              }
          ],
          "autoRollbackConfiguration": {
              "enabled": false
          },
          "triggerConfigurations": [],
          "serviceRoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployAssumeRole",
          "deploymentGroupName": "MyDemoDeploymentGroup",
          "onPremisesInstanceTagFilters": []
        }
      }
```


9. 事後作業
===========


完了
====