Help us understand the problem. What is going on with this article?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away