AWS

AWS S3 + CodePipeline + CodeBuild + CodeDeploy+ EC2

AWS

S3にzipで固めたソースファイルから1台のEC2にデプロイするって構成です。

 

① S3バケットの作成

 

  • バケット名:bf-deploy-bucket
  • バージョニングを有効化する

 

② IAMロールの作成

 

CodeDeploy-Manage-EC2-Role

 

CodeDeployからEC2やAutoScalingを参照・操作する為のロール

  • 「IAM → ロール → ロールの作成 → CodeDeploy → ユースケースの選択(CodeDeploy) → 次(アクセス権限) → 次(確認) → ロールの作成」

 

EC2-Manage-S3-Role

S3から情報取得するロールの作成

  • 「IAM → ロール → ロールの作成 → EC2 → 次(アクセス権限) → AmazonS3ReadOnlyAccessを選択 → 次(確認) → ロールの作成」

EC2にロールをアタッチ

  • 「ec2管理 → インスタンス選択 → アクション → インスタンスの設定 → IAMロールの割当て/置換」からアタッチ

 

タグを設定しておく

  • キー:Deploy
  • 値:bf

 

③ EC2でCodeDeploy-Agentをインストール

 

$ sudo yum -y install ruby wget
$ cd /home/ec2-user
$ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto

 

$ sudo systemctl enable codedeploy-agent
$ sudo systemctl start codedeploy-agent

 

$ sudo yum -y install httpd
$ sudo systemctl enable httpd
$ sudo systemctl start httpd

 

$ sudo mkdir -p /var/www/html/app
$ exit

 

 

④ アップロードするソースファイルを設計する

 

master.zip
├── appspec.yml
├── master.jar
├── test
      ┗── test.txt

こういう形とした。

 

appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/app
permissions:
  - object: /var/www/html/app
    owner: apache
    group: apache
    mode: 755
    type:
      - directory
  - object: /var/www/html/app
    owner: apache
    group: apache
    mode: 755
    type:
      - file

 

⑤ CodeDeploy デプロイグループの作成

 

●アプリケーション作成

 

  • CodeDeploy の Console画面にて、デプロイ → アプリケーション →
  • →デプロイのプラットフォームをEC2設定
  • →アプリケーションの作成

 

●デプロイグループ作成

  • デプロイグループ名:bf-DeployA
  • サービスロール:arn:aws:iam::925948485307:role/CodeDeploy-Manage-EC2-Role
  • デプロイタイプ:インプレース

 

●環境設定

Amazon EC2 インスタンス

タグ設定

キー:Deploy
値:bf

 

  • デプロイ設定:CodeDeployDefault.OneAtATime
  • ロードバランサー:ロードバランシングを有効にするのチェックをはずす

 

⑥パイプラインの作成

 

  • パイプライン名:bf-TEST-PipeLine
  • サービスロール:新規で作成

 

  • ソースプロバイダー:Amazon S3
  • バケット:bf-deploy-bucket
  • S3オブジェクトキー:master.zip
  • 検出オプションを変更する:Amazou CloudWatch Events(推奨)

 

  • ビルドステージを追加する:ビルドステージをスキップ
  • デプロイプロバイダー: AWS CodeDeploy
  • アプリケーション名:bf-TEST-App
  • デプロイグループ:bf-DeployA

 

 

⑦S3にアップロードしてデプロイ

master.zip
├── appspec.yml
├── master.jar
├── test
      ┗── test.txt

この構成でmaster.zipをbf-deploy-bucketバケットにアップロードすると、CloudWatch Eventが発火して、CodePipelineが走って、CodeDeploy、そしてEC2の/var/www/html/appにデプロイされる。

 

エラー対応

 

EC2のログから確認することができる

$ tail -F /var/log/aws/codedeploy-agent/codedeploy-agent.log

2019-10-07 13:00:26 INFO  [codedeploy-agent(3663)]: Version file found in /opt/codedeploy-agent/.version with agent version OFFICIAL_1.0-1.1597_rpm.
2019-10-07 13:00:26 ERROR [codedeploy-agent(3663)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile

 

IAMロールの読み込みの問題

CodeDeployエージェントがEC2のIAMロールを読み込んでいない

$ sudo systemctl restart codedeploy-agent

CodeDeployエージェントをインストールしてから、IAMロールを取り付けた場合は権限をエージェントが読みこめていない。

読み込ませる。

 

ソースの構成がおかしい

この構成なら、

master.zip
├── appspec.yml
├── master.jar
├── test
      ┗── test.txt

 

appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/app
permissions:
  - object: /var/www/html/app
    owner: apache
    group: apache
    mode: 755
    type:
      - directory
  - object: /var/www/html/app
    owner: apache
    group: apache
    mode: 755
    type:
      - file

こうなる。

 

本番とCodeDeployのリビジョンとの不整合

不整合が起こってますよ〜!っていう具体的な通知などはない。

本番のソースやログファイルなどが変化してしまって、CodeDeployのリビジョンとの整合性エラーでデプロイに失敗するようになる。

対応

  • CodeDeployのリビジョン管理からログや画像などのディレクトリを除外しておく
    設定として気をつける。
  • CodeDeploy, CodePipelineを削除して作り直して再デプロイ
    これが早い。

不整合が起こるとappspec.ymlなどが正しくてもひたすらエラーになるので詰まったら、5分もかからないのでCodeDeploy, CodePipelineを再作成してみるのがおすすめです。

 

 

appspec.yml hook対応版

 

 

master.zip
    ┝─master.jar
    ┝─appspec.yml
    ┗─scripts
            ┗─stopApache.sh
            ┗─startApache.sh

 

 

appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/app

hooks:
  BeforeInstall:
    - location: scripts/stopApache.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/startApache.sh
      timeout: 300
      runas: root

 

scripts/stopApache.sh

#!/bin/bash
set -e

# スクリプトディレクトリの取得
SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR

systemctl stop apache2

 

scripts/startApache.sh

#!/bin/bash
set -e

# スクリプトディレクトリの取得
SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR

systemctl start apache2

 

 

ELBを利用した場合のデプロイが遅い!

ELBの設定を確認する

デプロイ待機時間 ≒ Interval × Healthy Threshold

  • Interval: 20sec, Healthy Threshold:10sec
    →200秒ぐらい
  • Interval: 5sec, Healthy Threshold:5sec
    →25秒ぐらい

 

 

@see

hook

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)