AWS CodeDeploy 導入調査 AWS 設定編 の続きになります
前回のあらすじ
- EC2 インスタンスを作った
- コードアップロード用の S3 Bucket を作った
- デプロイ用の IAM ロールを作った
- CodeDeploy アプリケーションを作った
今回はアプリ側の作業です.
デプロイ先アプリ構成
Nginx - uWsgi を sudpervisord でプロセス監視
Nginx とか supervisord とかは割とどうでもいいのですが
サーバー構成はあらかじめ一通り作成しておきます.
さらに CodeDeloy-Agent をインストールしておきます.
http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install.html
とりあえずデプロイしてみる
ローカル -> S3 のアップロードは AWS-CLI を使用します.
ローカルプロジェクトのトップディレクトリで,
$ aws deploy push --application-name <<app-name>> --s3-location s3://<<s3bucket-name>>/<<app-name>>.zip --source ./ --region <<region-name>>
を実行します.
<<app-name>>
は CodeDeploy で作成したアップケーション名です.
- --ignore-hidden-files オプションで隠しファイルを無視します.
- S3 にアップロードするファイル名は本当はなんでもいいです.
- 圧縮時の拡張子は tar.gz でもいけるはず.
アップロードに成功すると以下のように出力されます.
To deploy with this revision, run:
aws deploy create-deployment --application-name <<app-name>> --s3-location bucket=<<s3bucket-name>>,key=<<app-name>>.zip,bundleType=zip,eTag=<<eTag>>--deployment-group-name <deployment-group-name> --deployment-config-name <deployment-config-name> --description <description>
ただし今回は成功しないと思います.
appspec.yml の作成
appspec.yml は CodeDeploy によるデプロイ作業を記述したものになります.
まずローカルプロジェクトのトップディレクトリに appspec.yml ファイルを作成し,
version: 0.0
os: linux
まで記述します. ここで,
- version は appspec のシステムバージョンで2017/04現在 0.0 のみ有効です
- os はデプロイ先 EC2 インスタンスの OS 種類で windows か linux かを設定します. linux ディストリビューションまで指定する必要はありません.
次に,
files:
- source: /
destination: /usr/local/src
でファイル配置を設定します.
source はコードパスで appspec.yml があるディレクリの相対パスになります.
なので source: / とした場合はディレクリ構成そのままで EC2 インスタンスの
destination に配置されます.
特定のディレクリ/ファイルのみ配置先を変えたい場合は - source: destination の記述を追加することができます.
さらに, 今回は以下の設定を追加しました.
hooks:
AfterInstall:
- location: copy_settings.sh
timeout: 180
runas: root
- location: pip_install.sh
timeout: 180
runas: root
ApplicationStart:
- location: reload_uwsgi.sh
timeout: 180
runas: root
hooks 以下では CodeDeploy ライフサイクルの各処理にフックしてスクリプトを実行させることができます.
http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html
CodeDeploy-Agent は Ruby で記述されており, Ruby コード上で Shell スクリプトを実行します.
今回追加した処理は
- コード配置後に EC2インスタンス内に仕込んでおいた追加設定をコピー
- プロジェクト内の requirements.txt の内容で pip install
- アプリスタート時に uwsgi のリスタート
です. runas は各スクリプトの実行ユーザーです.
今回は面倒だったので全て root にしました.
デプロイに再度チャレンジ
ふたたび ローカル -> S3 のアップロード をやってみると今度は成功するはずです.
アップロードが成功したら次は AWS コンソールの CodeDeploy に移動します.
- ダッシュボードでアプリケーションを選択して "アクション" -> "新しいリビジョンのデプロイ"
- "アプリケーション", "デプロイグループ" はそのまま, "リビジョンタイプ" は Amazon S3
- "リビジョンの場所" でアップロードしたソースコードを指定します.
- その他はそのままで "デプロイ" でデプロイ開始します.
フックスクリプトでエラーにならなければデプロイは成功するはずです.
フックスクリプトでエラーになったので解決した内容は次回