AWS
Jenkins
ElasticBeanstalk
aws-cli

JenkinsからBeanstalkへ自動デプロイする

More than 5 years have passed since last update.

皆様、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からは逃げ出せませんけどね(・ω<)