[JAWS-UG CLI] CodeDeploy #4 アプリケーションのデプロイ

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


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

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


AWS CLI
-------

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

* AWS CLI 1.11.5

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

結果(例):

      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71

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

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


0. 準備
=======


0.1. リージョンの決定
---------------------

```bash:変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

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

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       lambdaFull-handson-mbpr13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION


0.3. IAMロールの指定
--------------------

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


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


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

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


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

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

        CODED_APP_NAME:           ${CODED_APP_NAME}

ETX
```

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

結果(例):

      {
        "applicationId": "65ee4ebd-405a-4d60-bac5-e9f3b9291159"
      }

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

結果(例)

      {
        "application": {
          "applicationName": "handson-app-20161121",
          "linkedToGitHub": false,
          "applicationId": "65ee4ebd-405a-4d60-bac5-e9f3b9291159",
          "createTime": 1479717459.603
        }
      }


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


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

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


2.2. デプロイメント設定の指定
-----------------------------

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

結果(例)

      {
        "deploymentConfigsList": [
          "CodeDeployDefault.OneAtATime",
          "CodeDeployDefault.AllAtOnce",
          "CodeDeployDefault.HalfAtATime"
        ]
      }

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


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

まず、IAMロールのARNを取得します。

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

結果(例):

      arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployServiceRole



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

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

ETX
```

```bash:コマンド:
aws deploy create-deployment-group \
        --application-name ${CODED_APP_NAME} \
        --auto-scaling-groups ${AS_GROUP_NAME} \
        --deployment-group-name ${CODED_DEPLOY_GROUP_NAME} \
        --deployment-config-name ${CODED_DEPLOY_CONFIG_NAME} \
        --service-role-arn ${IAM_ROLE_ARN}
```

結果(例)

      {
        "deploymentGroupId": "4a177a8a-0b39-491a-b043-7ce3854e53dc"
      }


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


3.1. ソースコードの指定
-----------------------

```bash:変数の設定:
S3_BUCKET_NAME=aws-codedeploy-${AWS_DEFAULT_REGION}
S3_OBJECT_KEY='samples/latest/SampleApp_Linux.zip'
```


3.2. デプロイメントの作成
-------------------------

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

        CODED_APP_NAME:           ${CODED_APP_NAME}
        CODED_DEPLOY_CONFIG_NAME: ${CODED_DEPLOY_CONFIG_NAME}
        CODED_DEPLOY_GROUP_NAME:  ${CODED_DEPLOY_GROUP_NAME}
        S3_BUCKET_NAME:           ${S3_BUCKET_NAME}
        S3_OBJECT_KEY:            ${S3_OBJECT_KEY}

ETX
```

```bash:コマンド:
aws deploy create-deployment \
        --application-name ${CODED_APP_NAME} \
        --deployment-config-name ${CODED_DEPLOY_CONFIG_NAME} \
        --deployment-group-name ${CODED_DEPLOY_GROUP_NAME} \
        --s3-location bucket=${S3_BUCKET_NAME},bundleType=zip,key=${S3_OBJECT_KEY}
```

結果(例)

      {
        "deploymentId": "d-89DOVR11J"
      }


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

結果(例)

    [
      "d-xxxxxxxx"
    ]


```bash:変数の設定:
CODED_DEPLOYMENT_ID='<上記のdeployment ID>'
```

```bash:コマンド:
aws deploy get-deployment \
        --deployment-id ${CODED_DEPLOYMENT_ID} \
        --query "deploymentInfo.status"
```

結果(例):

  "Succeeded"



4. アプリケーションの確認
==

```bash:コマンド:
ARRAY_EC2_INSTANCES=$( \
        aws autoscaling describe-auto-scaling-groups \
          --auto-scaling-group-names ${AS_GROUP_NAME} \
          --query "AutoScalingGroups[0].Instances[*].InstanceId" \
          --output text \
) \
        && echo ${ARRAY_EC2_INSTANCES}
```

結果(例)

      i-08cc559c

```bash:コマンド:
EC2_INSTANCE_ID=$( \
        echo ${ARRAY_EC2_INSTANCES} \
        | sed 's/ .*$//' \
) \
        && echo ${EC2_INSTANCE_ID}
```

```bash:コマンド:
EC2_INSTANCE_IP=$( \
        aws ec2 describe-instances \
          --instance-id ${EC2_INSTANCE_ID} \
          --query "Reservations[0].Instances[0].PublicIpAddress" \
          --output text \
) \
        && echo ${EC2_INSTANCE_IP}
```

結果(例)

      xxx.xxx.xxx.xxx

```bash:コマンド:
ssh -i ${FILE_SSH_KEY} ec2-user@${EC2_INSTANCE_IP}
```

```bash:コマンド:
cat /var/www/html/index.html |grep '<h2>'
```

結果(例):

      <h2>This application was deployed using AWS CodeDeploy.</h2>


完了
====


参考(appspec.yml)
==================

http://s3-ap-northeast-1.amazonaws.com/aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Windows.zip をダウンロードして展開してみましょう。

appspec.yml というファイルにdeployで何をやるかが定義されています。