皆様、Beanstalkは使ってますでしょうか。
- デプロイの仕組みがあって手軽
- バージョン管理の仕組みがあって安心
- ELB, EC2, RDS, S3等のAWSのパーツを組み合わせてるだけなので、構成が分かりやすい
などなど、いいところが沢山あるのですが、イマイチ使われてるイメージがないです。
なので、ちょっとでも興味持ってもらおうと、CIの究極系、自動デプロイをやってみました。
やりかた
前提・お断り
- Jenkinsをどこかのサーバに導入してください
- Jenkinsを入れたサーバにAWS-CLIをインストールしてください
- サンプルはWARをアップするパターンです
- でも多分rubyとかはgit archiveでzip作ったら後は一緒だと思う
beanstalkでの作業
サンプルアプリケーションを作っておいて下さい。出来上がったアプリのapplication名、environment名を使います。
jenkinsでの作業
jenkinsで下記の環境変数を設定します。シェル実行でexportで書いてもOK。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_DEFAULT_REGION=ap-northeast-1
そして、アプリケーションのテスト実行後に、下のシェルをオプション付きで実行します。ソースコードのバージョン管理に含めてシェル実行で叩くのがよいと思います。
| オプション | 説明 |
|:--|:--|:--|
| -a | beanstalkでのApplication名 |
| -e | beanstalkでのEnvironment名 |
| -v | 任意のバージョン番号 $BUILD_NUMBER とか使うとよさ気 |
| -w | WARファイルの場所。git archiveで作ったzipでも可だと思う(未確認) |
| -b | S3のバケット名 |
#!/bin/sh
usage() {
echo "Usage: $0 [-a application name] [-e environment name] [-v version] [-w war file on local] [-b bucket name for elastic beanstalk]" 1>&2
exit 1
}
while getopts "a:e:v:w:b:h" opt
do
case $opt in
a) APP_NAME=$OPTARG ;;
e) ENV_NAME=$OPTARG ;;
v) VERSION=$OPTARG ;;
w) WAR_PATH=$OPTARG ;;
b) BUCKET=$OPTARG ;;
h) usage ;;
esac
done
if [ -z "$APP_NAME" ] || \
[ -z "$ENV_NAME" ] || \
[ -z "$VERSION" ] || \
[ -z "$WAR_PATH" ] || \
[ -z "$BUCKET" ]; then
usage
fi
function error() {
echo $1
exit 1
}
aws s3 cp ${WAR_PATH} s3://${BUCKET}/${VERSION}.war \
|| error "failed to upload S3"
aws elasticbeanstalk create-application-version \
--application-name ${APP_NAME} \
--version-label ${VERSION} \
--source-bundle S3Bucket=${BUCKET},S3Key=${VERSION}.war \
|| error "failed to create new version"
aws elasticbeanstalk update-environment \
--environment-name ${ENV_NAME} \
--version-label ${VERSION} \
|| error "failed to update environment"
うまく行けば、テスト実行後に自動デプロイが行われるはずです。
開発環境への自動デプロイなどにどうぞ。
まとめ
やってみるとかなり簡単なのが分かります。ぜひお試し下さい。
beanstalkを使ってない方は、ELBでEC2を複数並べるサービスを作る時はぜひ検討してみてください。まったくおんなじ構成をサクッと作れますし、後からbeanstalkを捨てるのも割と簡単です。おんなじパーツで同じ構成を組むのはさほど難しくはないので。AWSからは逃げ出せませんけどね(・ω<)