51
Spring Bootアプリケーションを Amazon Elastic Beanstalkに 一発でデプロイしてみよう Spring in Summer ~ 夏なのにSpring 2015-08-28 クラスメソッド株式会社 都元ダイスケ #jsug_sis

20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

  • Upload
    -

  • View
    6.298

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Spring in Summer ~ 夏なのにSpring

2015-08-28 クラスメソッド株式会社

都元ダイスケ

#jsug_sis

Page 2: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

自己紹介✦ よく訓練されたアップル信者、都元です。 ✦ Webアプリ屋出身のAWS屋 ✦ AWS歴約4年(since 2011夏) ✦ Twitter @daisuke_m ✦ 人間CloudFormer ✦ Seasar2からSpringへ

Page 3: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

今日は

アプリを

を使って に一発でデプロイ

でコンテナ化して

するお話

Page 4: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Do you know?

✦ DBの進化的設計を実現する開発プロセス ✦ 要するにRailsのmigrationのような ✦ 現在のJavaでいうFlywayのような ✦ EclipseプラグインによるER図エディタ

2006-20Jiemam

Page 5: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Jiemamy

✦ DBの進化的設計

✦ アプリケーションのビルドに伴って ✦ アプリケーションが依存するDBの構築を自動化 ✦ DBスキーマに対して変更管理を適用

Page 6: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

スマートビルド / デプロイ

–Miyamoto, Daisuke (2006)

“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、

コマンド1つで起動・デプロイができるべき”

2006年にここまで言ってたかどうか忘れましたが、 2008年には確実に言ってた。

この考えは現在も変わっていません。

Page 7: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

ってなことを訴え始めた2006年

✦ あの頃の俺は青かった。

✦ 自動化と管理の対象はDBじゃない。

✦DBを含む、インフラ全部だ。

Page 8: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

時は流れ2013年…

✦ 世はまさに大クラウド時代! ✦ AWSは全てがAPI! ✦ Infrastructure as Code! ✦ コマンド1つで、アプリケーションのビルド、インフラの構築、デプロイまでが実現できる世界

Page 9: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Single Command DeployThoughtWorks, Inc. Technology Radar March 2012

ここまでイントロ

Page 10: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

回線があればDemo✦ 前提条件

✦ インターネット接続回線があって ✦ AWSアカウントを持っていて ✦ EC2キーペアの発行・登録が終わっていて ✦ S3のバケットが1つ作ってあって ✦ アクセスキーを↓規定の場所に記述してある ~/.aws/credentials

✦ http://dev.classmethod.jp/cloud/aws/exclusive-aws-credentials-location/

Page 11: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

$ ### チェックアウト###

$ git clone [email protected]:classmethod-aws/berserker.git ~/tmp/sis-demo

$ cd ~/tmp/sis-demo

$ git checkout refs/tags/sis-demo

$ #### ここは各環境で異なるところ ###

$ cp env/_sample.gradle env/personal.gradle

$ sed -i '' -e 's/templateBucket:.*$/templateBucket: "cf-templates-1r72h3gknbax2-ap-northeast-1",/' env/personal.gradle

$ sed -i '' -e 's/KeyName:.*$/KeyName: "miyamoto-kp1",/' env/personal.gradle

$ diff env/_sample.gradle env/personal.gradle

$ ### デプロイ・HTTPアクセス・撤収 ###

$ ./gradlew -is awsFullDeploy

$ curl -s ...

$ ./gradlew -is awsFullUndeploy

Page 12: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Spring Boot

Page 13: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

最近のJavaフレームワーク✦ Play Framework ✦ Dropwizard ✦ Ninja framework ✦ Spring Boot

✦ アプリケーションサーバ(コンテナ)準備不要の、スタンドアローンアプリ。

✦ Javaプロセスを1つ立ち上げればHTTPサーバが動く。

Page 14: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Spring Bootの主な特徴✦ 簡単起動

✦ $ java -jar your-app.jar ✦ クラスパス設定やコンテナ準備不要。

✦ 設定の自動化 ✦ classpath内のクラスの有無によって自動設定 ✦ 設定のカスタマイズはアノテーションで

✦ Spring Bootを使ってみよう ✦ http://dev.classmethod.jp/server-side/spring-boot/

Page 15: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう
Page 16: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Flyway ~ DBの進化的設計✦ Jiemamy is dead

✦ スキーマにバージョンを付与 ✦ 前バージョンからの差分SQLを自作する ✦ どこまで適用したかは、実際のDB上に管理テーブルを作って記録 ✦ 未適用の差分SQLを順次適用することによるマイグレーション ✦ ただし、自動化されたロールバックは不可能 ✦ Flyway with Spring Boot でDBマイグレーションを自動化する

✦ http://dev.classmethod.jp/server-side/flyway-with-spring-boot/

Page 17: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう
Page 18: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Docker

Page 19: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

1プロセスのための環境✦ 一般的にサーバ上では様々なプロセスが起動 ✦ Applicationの実行には直接関係無いものも多数 ✦ Applicationプロセスとしてはザックリと、これだけあれば充分じゃない? ✦ プロセスが稼働する基盤 ✦ プロセスが読み書きする状態(filesystem)

✦ 他のプロセスは見えなくて良い。 ✦ 他のプロセス用のファイルも見えなくていい。

Page 20: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Docker for Spring Boot✦ 最小限のファイルシステムにJavaをインストールし、your-app.jar を取り込んだDockerイメージを作成

✦ イメージからDockerコンテナ(プロセス環境)を作成し、その中で java プロセスを起動

✦ Docker と Spring Boot は相性が良い。

Page 21: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Dockerfileの例FROM java:openjdk-8-jdkEXPOSE 8080WORKDIR /opt/berserker/ADD logback.xml /opt/berserker/logback.xmlADD berserker-x.xx.jar /opt/berserker/CMD /usr/bin/java \ -DJDBC_CONNECTION_STRING=$JDBC_CONNECTION_STRING \ ... -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE \ -Dlogging.config=/opt/berserker/logback.xml \ -Dserver.port=8080 \ -jar berserker-x.xx.jar

OpenJDK 8 インストール済みの ファイルシステムイメージ

アプリケーション本体jarの組み込み

起動コマンド

Page 22: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう
Page 23: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

AmazonElastic Beanstalk

Page 24: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

AWSの基礎知識

✦ ネットワーク:Amazon VPC ✦ データベース・サーバ:Amazon RDS ✦ アプリケーション・サーバ:Amazon EC2

Page 25: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

基本的な構成 (1) Single-AZ構成

✦ 可用性が足りない ✦ サービスを止めずにメンテナンスできない

✦ スケーラビリティが足りない ✦ 付加が増えても垂直にしかスケールできない

サーバは落ちるものだし、水平スケール出来るのが望ましい 可用性が欲しい・スケーラビリティが欲しい

Page 26: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

基本的な構成 (2) Multi-AZ構成

✦ AZ(≒AWSのデータセンター)が1つ丸ごとぶっ飛んでも、サービスが継続できる

✦ 負荷が増えたら水平にスケールできる ✦ ただし、アプリケーション・サーバをステートレスに保たなければならない ✦ データをファイルシステムに書かない ✦ RDBやS3に書き出す

Page 27: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Elastic Beanstalk

✦ このようなWebシステムの基本構成を自動構築 ✦ 開発者はApplication Bundle(Beanstalkの作法に従ったファイルを含有したZIPファイル)を作成し、AWSに食わせる

✦ これだけで、アプリの動作環境が構築完了する

Page 28: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Application Bundle✦ App一式を含むZIPファイル

✦ Spring Bootアプリケーション(jar) ✦ logback.xml(ログ設定) ✦ Dockerfile(前述)

✦ これをZIPで固めてAmazon S3にアップロード

Page 29: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

CloudFormation✦ Beanstalkの守備範囲

✦ アプリケーションサーバシステム ✦ ELB, EC2 (AutoScaling) ...

✦ CloudFormationの守備範囲 ✦ システム全体を構成する周辺AWSリソース

✦ Beanstalk, VPC, S3, RDS ...

Page 30: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう
Page 31: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

アプリケーションのデプロイと システムのデプロイ

–Miyamoto, Daisuke

“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、

コマンド1つでシステムの起動・デプロイができるべき”

Page 32: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

CloudFormation

Template

+Parameter

Parameter

Stack

Bucket withObjects

DynamoDB Table

ELB

Instances Auto Scaling Amazon CloudFront

基本的システム構成S3, DynamoDB, EC2,

IAM, AutoScaling, SecurityGroup,ELB, CloudFront

Instance Type, クラスタの台数,

SSH接続元IP, キー名, ...等

Page 33: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Template

JSON、ということはインフラを バージョン管理できる\(^o^)/

Page 34: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

インフラの進化的設計

• インフラの構成をTemplateとしてバージョン管理する

• TemplateからStackを作る(構築)

• インフラ構成を追加・編集(そしてバージョン管理)

• 既存Stackを新しいテンプレートで更新する(成長)

Page 35: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Gradle

Page 36: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Gradle

✦ みなさまご存知のジョブ実行基盤 ✦ Javaの依存ライブラリ管理~ビルド、パッケージング

✦ Spring Bootアプリケーションの起動 ✦ プラグイン:spring-boot-gradle-plugin

Page 37: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう
Page 38: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

ではこれを…

✦ App Bundleの作成に使えないだろうか? ✦ App BundleのS3 uploadに使えないだろうか? ✦ Beanstalkの環境起動に使えないだろうか?

✦ 全部Yes!!

Page 39: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

App Bundle作成task createBundle(type: Zip, dependsOn: bootRepackage) { archiveName = ... // zipファイル名 from "src/main/bundle" // Dockerfile等 from jar.archivePath // jar}

Page 40: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

gradle-aws-plugin

✦ GradleからAWSリソースを操作したい ✦ 参考: https://github.com/classmethod-aws/gradle-aws-plugin

Page 41: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

CloudFormation操作cloudFormation { stackName = 'berserker' conventionMapping.stackParams = { // (snip) return stackParams } capabilityIam true templateFile = file('berserker.template') templateBucket = ... templateKeyPrefix = ... } awsCfnMigrateStack.mustRunAfter uploadBundleawsCfnMigrateStack.dependsOn awsCfnUploadTemplate

Page 42: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

S3へのリソースアップロード

task createBundle(type: Zip, dependsOn: ...) { // (snip) }

task uploadBundle(dependsOn: createBundle, type: AmazonElasticBeanstalkUploadBundleTask) { file project.createBundle.archivePath overwrite project.version.endsWith('-SNAPSHOT')}

Page 43: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Gradle Task Graph

Page 44: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

一発タスクtask awsFullDeploy(dependsOn: [ uploadBundle, awsCfnUploadTemplate, awsCfnMigrateStackAndWaitComplete ]) task awsFullUndeploy(dependsOn: [ awsCfnDeleteStackAndWaitCompleted ])

Page 45: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Gradle Task

✦ ./gradlew bootRun

✦ ./gradlew awsFullDeploy

✦ ./gradlew awsFullUndeploy

Page 46: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

システム ポータビリティ

Page 47: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Full Described System✦ システム構築及び運用のコード化・自動化―― Automated

✦ 自動化しない・できない部分はポエムを書く―― Documented

✦ システムの構成全てが「記述」されている。

Page 48: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

✦ 1つのAWSアカウント内に複数の環境を構築できる。 ✦ 例えば本番環境と開発環境等。 ✦ 社内で共通のAWSアカウントに展開する。

✦ あらゆるAWSアカウントに環境を構築できる。 ✦ 例えば個人検証環境。サンドボックス。 ✦ 開発者毎の個人検証用AWSアカウントに展開する。

✦ あらゆるリージョンに環境を構築できる。 ✦ と、いいかもね。DRの視点で。

Page 49: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

環境依存設定✦ プロジェクト直下のenvディレクトリに設定ファイルを置き、それを動的に読み込む

-Penv=prd

✦env/ ✦ .gititnore ✦ _sample.gradle ✦prd.gradle ✦dev.gradle ✦personal.gradle

✦profile名(AWSのキー) ✦リージョン名 ✦EC2キーファイルのパス ✦各種CFnパラメータ ✦ローカルDB名、user、pass ✦ログ設定ファイルのパス

Page 50: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

portability✦ ./gradlew awsFullDeploy -Penv=prd

✦ ./gradlew awsFullDeploy -Penv=dev

✦ ./gradlew awsFullDeploy -Penv=personal

✦ 詳しくは Developers.IO「プロジェクトに対する環境固有設定の導入」http://bit.ly/gradle-env-dep-config を参照。

Page 51: 20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう

まとめ