Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

7,358 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. Spring Bootアプリケーションを Amazon Elastic Beanstalkに
 一発でデプロイしてみよう Spring in Summer ∼ 夏なのにSpring 2015-08-28 クラスメソッド株式会社 都元ダイスケ #jsug_sis
  2. 2. 自己紹介 ✦ よく訓練されたアップル信者、都元です。 ✦ Webアプリ屋出身のAWS屋 ✦ AWS歴約4年(since 2011夏) ✦ Twitter @daisuke_m ✦ 人間CloudFormer ✦ Seasar2からSpringへ
  3. 3. 今日は アプリを を使って に一発でデプロイ でコンテナ化して するお話
  4. 4. Do you know? ✦ DBの進化的設計を実現する開発プロセス ✦ 要するにRailsのmigrationのような ✦ 現在のJavaでいうFlywayのような ✦ EclipseプラグインによるER図エディタ 2006-20 Jiemam
  5. 5. Jiemamy ✦ DBの進化的設計 ✦ アプリケーションのビルドに伴って ✦ アプリケーションが依存するDBの構築を自動化 ✦ DBスキーマに対して変更管理を適用
  6. 6. スマートビルド / デプロイ –Miyamoto, Daisuke (2006) リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、 コマンド1つで起動・デプロイができるべき 2006年にここまで言ってたかどうか忘れましたが、 2008年には確実に言ってた。 この考えは現在も変わっていません。
  7. 7. ってなことを訴え始めた2006年 ✦ あの頃の俺は青かった。 ✦ 自動化と管理の対象はDBじゃない。 ✦DBを含む、インフラ全部だ。
  8. 8. 時は流れ2013年… ✦ 世はまさに大クラウド時代! ✦ AWSは全てがAPI! ✦ Infrastructure as Code! ✦ コマンド1つで、アプリケーションのビルド、
 インフラの構築、デプロイまでが実現できる世界
  9. 9. Single Command Deploy ThoughtWorks, Inc. Technology Radar March 2012 ここまでイントロ
  10. 10. 回線があればDemo ✦ 前提条件 ✦ インターネット接続回線があって ✦ AWSアカウントを持っていて ✦ EC2キーペアの発行・登録が終わっていて ✦ S3のバケットが1つ作ってあって ✦ アクセスキーを↓規定の場所に記述してある
 ~/.aws/credentials ✦ http://dev.classmethod.jp/cloud/aws/exclusive- aws-credentials-location/
  11. 11. $ ### チェックアウト### $ git clone git@github.com: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
  12. 12. Spring Boot
  13. 13. 最近のJavaフレームワーク ✦ Play Framework ✦ Dropwizard ✦ Ninja framework ✦ Spring Boot ✦ アプリケーションサーバ
 (コンテナ)準備不要の、スタンドアローンアプリ。 ✦ Javaプロセスを1つ立ち上げればHTTPサーバが動く。
  14. 14. Spring Bootの主な特徴 ✦ 簡単起動 ✦ $ java -jar your-app.jar ✦ クラスパス設定やコンテナ準備不要。 ✦ 設定の自動化 ✦ classpath内のクラスの有無によって自動設定 ✦ 設定のカスタマイズはアノテーションで ✦ Spring Bootを使ってみよう ✦ http://dev.classmethod.jp/server-side/spring-boot/
  15. 15. Flyway ∼ DBの進化的設計 ✦ Jiemamy is dead ✦ スキーマにバージョンを付与 ✦ 前バージョンからの差分SQLを自作する ✦ どこまで適用したかは、実際のDB上に管理テーブルを作って記録 ✦ 未適用の差分SQLを順次適用することによるマイグレーション ✦ ただし、自動化されたロールバックは不可能 ✦ Flyway with Spring Boot でDBマイグレーションを自動化する ✦ http://dev.classmethod.jp/server-side/flyway-with-spring-boot/
  16. 16. Docker
  17. 17. 1プロセスのための環境 ✦ 一般的にサーバ上では様々なプロセスが起動 ✦ Applicationの実行には直接関係無いものも多数 ✦ Applicationプロセスとしてはザックリと、これだけあ れば充分じゃない? ✦ プロセスが稼働する基盤 ✦ プロセスが読み書きする状態(filesystem) ✦ 他のプロセスは見えなくて良い。 ✦ 他のプロセス用のファイルも見えなくていい。
  18. 18. Docker for Spring Boot ✦ 最小限のファイルシステムにJavaをインストー ルし、your-app.jar を取り込んだDockerイメー ジを作成 ✦ イメージからDockerコンテナ(プロセス環境) を作成し、その中で java プロセスを起動 ✦ Docker と Spring Boot は相性が良い。
  19. 19. Dockerfileの例 FROM java:openjdk-8-jdk
 EXPOSE 8080
 WORKDIR /opt/berserker/
 ADD logback.xml /opt/berserker/logback.xml
 ADD 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の組み込み 起動コマンド
  20. 20. Amazon
 Elastic Beanstalk
  21. 21. AWSの基礎知識 ✦ ネットワーク:Amazon VPC ✦ データベース・サーバ:Amazon RDS ✦ アプリケーション・サーバ:Amazon EC2
  22. 22. 基本的な構成 (1) Single-AZ構成 ✦ 可用性が足りない ✦ サービスを止めずにメンテナンスできない ✦ スケーラビリティが足りない ✦ 付加が増えても垂直にしかスケールできない サーバは落ちるものだし、水平スケール出来るのが望ましい 可用性が欲しい・スケーラビリティが欲しい
  23. 23. 基本的な構成 (2) Multi-AZ構成 ✦ AZ( AWSのデータセンター)が1つ 丸ごとぶっ飛んでも、サービスが継続 できる ✦ 負荷が増えたら水平にスケールできる ✦ ただし、アプリケーション・サーバを ステートレスに保たなければならない ✦ データをファイルシステムに書かない ✦ RDBやS3に書き出す
  24. 24. Elastic Beanstalk ✦ このようなWebシステムの基本構成を自動構築 ✦ 開発者はApplication Bundle(Beanstalkの作 法に従ったファイルを含有したZIPファイル)を 作成し、AWSに食わせる ✦ これだけで、アプリの動作環境が構築完了する
  25. 25. Application Bundle ✦ App一式を含むZIPファイル ✦ Spring Bootアプリケーション(jar) ✦ logback.xml(ログ設定) ✦ Dockerfile(前述) ✦ これをZIPで固めてAmazon S3にアップロード
  26. 26. CloudFormation ✦ Beanstalkの守備範囲 ✦ アプリケーションサーバシステム ✦ ELB, EC2 (AutoScaling) ... ✦ CloudFormationの守備範囲 ✦ システム全体を構成する周辺AWSリソース ✦ Beanstalk, VPC, S3, RDS ...
  27. 27. アプリケーションのデプロイと システムのデプロイ –Miyamoto, Daisuke リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、 コマンド1つでシステムの起動・デプロイができるべき
  28. 28. CloudFormation Template + Parameter Parameter Stack Bucket with Objects DynamoDB Table ELB Instances Auto Scaling Amazon CloudFront 基本的システム構成 S3, DynamoDB, EC2, IAM,AutoScaling, SecurityGroup, ELB, CloudFront Instance Type, クラスタの台数, SSH接続元IP, キー名, ...等
  29. 29. Template JSON、ということはインフラを バージョン管理できる\(^o^)/
  30. 30. インフラの進化的設計 • インフラの構成をTemplateとしてバージョン管理する • TemplateからStackを作る(構築) • インフラ構成を追加・編集(そしてバージョン管理) • 既存Stackを新しいテンプレートで更新する(成長)
  31. 31. Gradle
  32. 32. Gradle ✦ みなさまご存知のジョブ実行基盤 ✦ Javaの依存ライブラリ管理∼ビルド、パッケー ジング ✦ Spring Bootアプリケーションの起動 ✦ プラグイン:spring-boot-gradle-plugin
  33. 33. ではこれを… ✦ App Bundleの作成に使えないだろうか? ✦ App BundleのS3 uploadに使えないだろうか? ✦ Beanstalkの環境起動に使えないだろうか? ✦ 全部Yes!!
  34. 34. App Bundle作成 task createBundle(type: Zip,
 dependsOn: bootRepackage) {
 
 archiveName = ... // zipファイル名
 from "src/main/bundle" // Dockerfile等
 from jar.archivePath // jar
 }
  35. 35. gradle-aws-plugin ✦ GradleからAWSリソースを操作したい ✦ 参考: https://github.com/classmethod-aws/ gradle-aws-plugin
  36. 36. CloudFormation操作 cloudFormation {
 stackName = 'berserker'
 conventionMapping.stackParams = {
 // (snip)
 return stackParams
 }
 capabilityIam true
 templateFile = file('berserker.template')
 templateBucket = ...
 templateKeyPrefix = ...
 }
 
 awsCfnMigrateStack.mustRunAfter uploadBundle
 awsCfnMigrateStack.dependsOn awsCfnUploadTemplate
  37. 37. S3へのリソースアップロード task createBundle(type: Zip, dependsOn: ...) {
 // (snip)
 } task uploadBundle(dependsOn: createBundle,
 type: AmazonElasticBeanstalkUploadBundleTask) {
 file project.createBundle.archivePath
 overwrite project.version.endsWith('-SNAPSHOT')
 }
  38. 38. Gradle Task Graph
  39. 39. 一発タスク task awsFullDeploy(dependsOn: [
 uploadBundle,
 awsCfnUploadTemplate,
 awsCfnMigrateStackAndWaitComplete
 ])
 
 task awsFullUndeploy(dependsOn: [
 awsCfnDeleteStackAndWaitCompleted
 ])
  40. 40. Gradle Task ✦ ./gradlew bootRun ✦ ./gradlew awsFullDeploy ✦ ./gradlew awsFullUndeploy
  41. 41. システム ポータビリティ
  42. 42. Full Described System ✦ システム構築及び運用のコード化・自動化
 ―― Automated ✦ 自動化しない・できない部分はポエムを書く
 ―― Documented ✦ システムの構成全てが「記述」されている。
  43. 43. ✦ 1つのAWSアカウント内に複数の環境を構築できる。 ✦ 例えば本番環境と開発環境等。 ✦ 社内で共通のAWSアカウントに展開する。 ✦ あらゆるAWSアカウントに環境を構築できる。 ✦ 例えば個人検証環境。サンドボックス。 ✦ 開発者毎の個人検証用AWSアカウントに展開する。 ✦ あらゆるリージョンに環境を構築できる。 ✦ と、いいかもね。DRの視点で。
  44. 44. 環境依存設定 ✦ プロジェクト直下のenvディレクトリに
 設定ファイルを置き、それを動的に読み込む -Penv=prd ✦ env/ ✦ .gititnore ✦ _sample.gradle ✦ prd.gradle ✦ dev.gradle ✦ personal.gradle ✦ profile名(AWSのキー) ✦ リージョン名 ✦ EC2キーファイルのパス ✦ 各種CFnパラメータ ✦ ローカルDB名、user、pass ✦ ログ設定ファイルのパス
  45. 45. portability ✦ ./gradlew awsFullDeploy -Penv=prd ✦ ./gradlew awsFullDeploy -Penv=dev ✦ ./gradlew awsFullDeploy -Penv=personal ✦ 詳しくは Developers.IO
 「プロジェクトに対する環境固有設定の導入」
 http://bit.ly/gradle-env-dep-config を参照。
  46. 46. Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう まとめ

×