O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless

609 visualizações

Publicada em

2016/11/25に開催されたJava Meeting Sendaiでの講演資料です。

Publicada em: Serviços
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless

  1. 1. Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless Keisuke Nishitani (@Keisuke69) Amazon Web Services Japan K.K. Nov 25, 2016
  2. 2. Profile Keisuke Nishitani Specialist Solutions Architect, Amazon Web Service Japan K.K @Keisuke69 Keisuke69 ✤ Specialist SA - Serverless - Mobile - DevOps - Application Service ✤ ソーシャルで⾚ドクロの⼈です ✤ RESTおじさん ✤ 餃⼦の王将エヴァンジェリスト(⾃称) ✤ ⾳楽が好きです、フジロッカーです、今年も⾏きました ✤ ブログ: http://keisuke69.hatenablog.jp/ Keisuke69 Keisuke69Keisuke69x
  3. 3. Amazonの代表的なサービス
  4. 4. Amazonの代表的なサービス amazon.co.jp おなじみの通販サイト
  5. 5. Amazonの代表的なサービス amazon services 出品/出店サービス
  6. 6. Amazonの代表的なサービス amazon web services ITインフラサービス
  7. 7. はサーバや ストレージといったITリソースを 電気・ガス・⽔道と同じように 必要なときに、必要なだけ 使えるようにしたサービスです
  8. 8. 190カ国に及ぶ100万以上のお客様
  9. 9. ⽇本でAWSクラウドを利⽤するお客様:20,000以上
  10. 10. Startupも!
  11. 11. AWSクラウドの現在 ✤ 世界に先駆けて2006年よりクラウドサービスを提供 ✤ 世界に14箇所のリージョン(データセンタ群) ✤ 2015年で合計722回のイノベーション新機能・機能改善を実施 ✤ 累計57回の値下げをして利益をお客様へ還元
  12. 12. Gartner Magic Quadrant for Cloud Infrastructure as a Service, Worldwide *でリーダーポジションに GartnerはAWS をリーダー エリアの中でも、ビジョン の完全性と実⾏能⼒が最も 優れていると評価 *Gartner, Magic Quadrant for Cloud Infrastructure as a Service, Worldwide, Leong, Lydia, Petri, Gregor, Gill, Bob, Dorosh, Mike, August 32016 This graphic was published by Gartner, Inc. as part of a larger research document and should be evaluated in the context of the entire document. The Gartner document is available upon request from AWS : http://www.gartner.com/doc/reprints?id=1-2G2O5FC&ct=150519&st=sb Gartner does not endorse any vendor, product or service depicted in its research publications, and does not advise technology users to select only those vendors with the highest ratings or other designation. Gartner research publications consist of the opinions of Gartner's research organization and should not be construed as statements of fact. Gartner disclaims all warranties, expressed or implied, with respect to this research, including any warranties of merchantability or fitness for a particular purpose.
  13. 13. Networking AnalyticsCompute Storage & Content Delivery Developer Tools Management Tools Security & Identity Application Services Mobile Services Database Enterprise Applications S3 CloudFront EFS Glacier Storage Gateway API Gateway AppStream CloudSearch Elastic Transcoder SES SQS SWF Mobile AnalyticsCognito Device Farm SNS RDS DynamoDB ElastiCache RedShift WorkSpaces WorkDocs WorkMail Lambda EC2 Container ServiiceEC2 VPC Direct Connect Route 53 EMR Data Pipeline Kinesis Machine Learning Elastic Load Balancing QuickSight Elasticsearch Service CodeCommit CloudWatch Cloud Formation CloudTrail Config OpsWorks ServiceC atalog Identity &Acc ess Managem ent Directory S ervice Trusted Advisor WAF Snowball DMS IOT IoT Game Development Mobile Hub Elastic Beanstalk ACM Inspector GameLift CodePipelineCodeDeploy 70以上のAWSサービス群を提供
  14. 14. AWSの各サービスは アーキテクチャにおけるブロックの役割
  15. 15. 本⽇のお題
  16. 16. Javaとクラウド
  17. 17. Javaとクラウド…?
  18. 18. ⼤きく2つ ✤ Javaでクラウドをコントロール ✤ Javaアプリをクラウドで実⾏
  19. 19. Javaでクラウドをコントロール
  20. 20. Networking AnalyticsCompute Storage & Content Delivery Developer Tools Management Tools Security & Identity Application Services Mobile Services Database Enterprise Applications S3 CloudFront EFS Glacier Storage Gateway API Gateway AppStream CloudSearch Elastic Transcoder SES SQS SWF Mobile AnalyticsCognito Device Farm SNS RDS DynamoDB ElastiCache RedShift WorkSpaces WorkDocs WorkMail Lambda EC2 Container ServiiceEC2 VPC Direct Connect Route 53 EMR Data Pipeline Kinesis Machine Learning Elastic Load Balancing QuickSight Elasticsearch Service CodeCommit CloudWatch Cloud Formation CloudTrail Config OpsWorks ServiceC atalog Identity &Acc ess Managem ent Directory S ervice Trusted Advisor WAF Snowball DMS IOT IoT Game Development Mobile Hub Elastic Beanstalk ACM Inspector GameLift CodePipelineCodeDeploy ほとんどのサービスに⽤意されたAPI
  21. 21. SDK Ruby iOS Python (boto) Android Node.js AWS Toolkit for Visual Studio .NET AWS Toolkit for Eclipse PHP AWS Tools for Windows PowerShell AWS CLI JavaScriptJava Xamarin
  22. 22. SDK Java
  23. 23. プログラマブル ✤ クラウドはAPIでコントロールできるのが当たり前 ✤ AWSの場合、ほぼ全てのサービスにAPIがある ✤ ネットワークからプラットフォーム⾃体まで、どのレイヤもプログラ マのコンテキストでコントロールできる ✤ 各サービスの利⽤を抽象化たフレームワークを⽤意して透過的に利⽤ することも可能
  24. 24. つまり全てを意のままに
  25. 25. EC2インスタンスを起動する例 RunInstancesRequest runInstancesRequest = new RunInstancesRequest(); runInstancesRequest.withImageId("ami-4b814f22") .withInstanceType("m1.small") .withMinCount(1) .withMaxCount(1) .withKeyName("my-key-pair") .withSecurityGroups("my-security-group");
  26. 26. DynamoDBにデータを⼊れる例 AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider()); DynamoDBMapper mapper = new DynamoDBMapper(client); CatalogItem item = new CatalogItem(); item.setId(102); item.setTitle("Book 102 Title"); item.setISBN("222-2222222222"); item.setBookAuthors(new HashSet<String>(Arrays.asList("Author 1", "Author 2"))); item.setSomeProp("Test"); mapper.save(item);
  27. 27. Javaアプリをクラウドで実⾏
  28. 28. 実⾏パターン ✤ Amazon Elastic Compute Cloud (EC2) ✤ Docker + Amazon EC2 Container Service (ECS) ✤ AWS Lambda
  29. 29. AWSのComputeサービス Amazon EC2 Amazon ECS AWS Lambda スケールの単位 インスタンス アプリケーション ファンクション 抽象化 ハードウェア OS ランタイム
  30. 30. AWSのComputeサービス Amazon EC2 Amazon ECS AWS Lambda スケールの単位 インスタンス アプリケーション ファンクション 抽象化 ハードウェア OS ランタイム
  31. 31. Amazon EC2 ✤ 台数やスペックを柔軟に変更可能な仮想サーバ ⎻ 各種Linux/Windows ⎻ 多様なインスタンスタイプ、状況に応じて最適なスペックを選択可能 ✤ AMI(Amazon Machine Image)を利⽤した環境のコピーによる構築や AutoScalingによる⾃動スケールアウト/スケールイン ✤ 慣れ親しんだ通常のサーバと同じように扱える ⎻ 好きなランタイム、アプリケーションサーバの導⼊ ⎻ これまでの知識をそのまま活かすことが可能 ※ただし、クラウド固有の機能や特性を活かすほうがオススメ
  32. 32. EC2と合わせてよく使われるサービス ✤ ELB(Elastic Load Balancing) ⎻ マネージドロードバランサーサービス ⎻ L4ベースのCLBとコンテンツベース(L7)のルーティングを提供するALB ⎻ ALBはコンテナベースのアプリケーションもサポート ✤ Amazon RDS ⎻ マネージドデータベースサービス ⎻ MySQL/PostgreSQL/Oracle/SQL Serverといって⼀般的なエンジンに加え、 クラウドネイティブに設計されたAuroraも利⽤可能 ⎻ 冗⻑構成、マスタ/スレーブ構成や⾃動バックアップなどを数クリックで利⽤可能 ✤ Amazon S3 ⎻ 容量無制限のオンラインストレージ ⎻ ⾃動的に複数DCに保存し、⾼い耐久性を実現 ⎻ 保存した分だけの安価な従量課⾦
  33. 33. ⼀般的な3-tier Webアプリの場合 プレゼンテーション層 ロジック層 データストア層 Webサーバ/アプリサーバブラウザ/モバイル データベース
  34. 34. AWSで作るとこうなる AP (EC2) DB (RDS) LB (ELB) Web (EC2) Static Contents (S3) ブラウザ/モバイル CDN (CloudFront)
  35. 35. イイのあります
  36. 36. AWS Elastic Beanstalk 定番構成の構築/デプロイを ⾃動化するサービス
  37. 37. AWS Elastic Beanstalk ✤ELB + Web+(DB)の定番構成 で利⽤ ✤Auto Scaling利⽤可能 ✤ログやアプリはS3に
  38. 38. AWS Elastic Beanstalk ✤アプリケーションを簡単に デプロイ ✤複数環境を切り替え可能
  39. 39. 対応している構成と⾔語環境 Elastic Load Balancing Web Tier deploy! Java Python PHP .NET Ruby nodeJS Docker Amazon RDS Auto scaling Group … Auto scaling GroupQueue Async Tasks Worker Tier …
  40. 40. AWSのComputeサービス Amazon EC2 Amazon ECS AWS Lambda スケールの単位 インスタンス アプリケーション ファンクション 抽象化 ハードウェア OS ランタイム
  41. 41. コンテナのメリット Portable Flexible Fast Efficient Server Guest OS Bins/Libs Bins/Libs App2App1
  42. 42. コンテナのメリット ⼀貫性のある環境 ⾼い⽣産性 バージョン管理 効率的な オペレーション
  43. 43. Dockerの特徴 Package Ship Run
  44. 44. Dockerfile例 # GlassFish on Docker FROM glassfish/openjdk # Maintainer MAINTAINER Bruno Borges <bruno.borges@oracle.com> # Set environment variables and default password for user 'admin' ENV GLASSFISH_PKG=glassfish-4.1.1.zip GLASSFISH_URL=http://download.oracle.com/glassfish/4.1.1/release/glassfish-4.1.1.zip GLASSFISH_HOME=/glassfish4 PATH=$PATH:/glassfish4/bin PASSWORD=glassfish # Install packages, download and extract GlassFish # Setup password file # Enable DAS RUN apk add --update wget unzip && wget --no-check-certificate $GLASSFISH_URL && unzip -o $GLASSFISH_PKG && rm -f $GLASSFISH_PKG && apk del wget unzip && echo "--- Setup the password file ---" && echo "AS_ADMIN_PASSWORD=" > /tmp/glassfishpwd && echo "AS_ADMIN_NEWPASSWORD=${PASSWORD}" >> /tmp/glassfishpwd && echo "--- Enable DAS, change admin password, and secure admin access ---" && asadmin --user=admin --passwordfile=/tmp/glassfishpwd change-admin-password --domain_name domain1 && asadmin start-domain && echo "AS_ADMIN_PASSWORD=${PASSWORD}" > /tmp/glassfishpwd && asadmin --user=admin --passwordfile=/tmp/glassfishpwd enable-secure-admin && asadmin --user=admin stop-domain && rm /tmp/glassfishpwd # Ports being exposed EXPOSE 4848 8080 8181 # Start asadmin console and the domain CMD ["asadmin", "start-domain", "-v"]
  45. 45. Cluster Management
  46. 46. $ docker run myimage Server Guest OS Bins/Libs Bins/Libs App2App1
  47. 47. Amazon EC2 Container Service (ECS) ✤ 管理ノード不要の、安定かつ⾼パフォーマンスなクラスタ管理サービス ✤ Dockerコンテナを複数のEC2インスタンスに分散配置 ✤ ⼀時的な計算処理にも、ロングランニングな処理にも対応 ✤ ELB連携など各種AWSサービスとの親和性 ✤ Amazon ECS⾃体の利⽤は無料 複数のコンテナをEC2のクラスタ上で⼀元管理できるサービス
  48. 48. Cluster Management Engine Agent Communication Service API Key/Value Store Amazon ECS AZ ECS Agent Container Instance Task Container Task Container Docker AZ ECS Agent Container Instance Task Container Task Container Docker ECS Agent Container Instance Task Container Task Container Docker ELB ELB User/Scheduler
  49. 49. AWSのComputeサービス Amazon EC2 Amazon ECS AWS Lambda スケールの単位 インスタンス アプリケーション ファンクション 抽象化 ハードウェア OS ランタイム
  50. 50. すべてのデベロッパーをハッピーに AWS Lambda ⾼いコスト効率インフラ管理不要 使った分だけ100ms単位で課⾦ ⾃分のコードを実⾏ 標準的な⾔語のコードを実⾏ビジネスロジックにフォーカス
  51. 51. サーバレスなアプリケーションモデル イベントソース ファンクション サービスなど Java Node.js Python λ イベント S3にオブジェクトが作られる Kinesisにストリームデータが保存される HTTPSによるリクエスト etc...
  52. 52. Amazon S3 Amazon DynamoDB Amazon Kinesis AWS CloudFormation AWS CloudTrail Amazon CloudWatch Amazon SNSAmazon SES Amazon API Gateway Amazon Cognito AWS IoT Amazon Alexa Cron events DATA STORES ENDPOINTS REPOSITORIES EVENT/MESSAGE SERVICES AWS Lambdaと連携するイベントソース Amazon Config Amazon Aurora New!
  53. 53. プログラミングモデル(Javaの場合) ✤ inputType / outputType ⎻ inputTypa: イベントソースから発⾏されたイベントデータもしくは任意のデータオブジェクト ⎻ outputType: 同期呼び出し時のレスポンスとなり、サポートされているあらゆる型を利⽤可能 ✤ Context(省略可能) ⎻ Lambdaファンクションの実⾏環境に関する情報が格納されている ✤ 利⽤可能な型 ⎻ プリミティブ型(intなど)およびString、Integer、Boolean、Map、List、Stream ⎻ aws-lambda-java-eventsで提供されるイベントデータ型(S3Eventなど) ⎻ 独⾃のPOJOオブジェクト ⎻ ⾃動的にJSON形式にシリアライズ/デシリアライズされるが、⾃前でやりたい場合はStream型を指定する ✤ Contextオブジェクトや事前定義済みのインターフェースを提供するaws-lambda-java-coreと各イ ベントの事前定義された型を提供するaws-lambda-java-eventsを利⽤して実装すると楽 public outputType handler-name(inputType input, Context context) { ... }
  54. 54. コード例 package com.sample.lambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.events.S3Event; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord; import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.S3Object; public class S3EventHandler { public String handler(S3Event event, Context context) { LambdaLogger lambdaLogger = context.getLogger(); S3EventNotificationRecord record = event.getRecords().get(0); String bucket = record.getS3().getBucket().getName(); String key = record.getS3().getObject().getKey(); AmazonS3 s3 = new AmazonS3Client(); S3Object object = s3.getObject(new GetObjectRequest(bucket, key)); String content_type = object.getObjectMetadata().getContentType(); lambdaLogger.log("Content-Type: " + content_type); return content_type; } }
  55. 55. AWS Lambdaを利⽤する場合のユースケース Data Processing Control SystemsBackends
  56. 56. AWS Lambdaを利⽤する場合のユースケース データの変更、システム状態の遷移もしくはユーザによ るアクションといったものに対応したコードの実⾏ レスポンスのカスタマイズとAWS内の状態やデータ変更 に対するワークフローのレスポンス Web、モバイル、IoTや外部APIへのリクエストを扱う バックエンドロジックの実⾏ Data Processing Backends Control Systems
  57. 57. Real-time File Processing ✤ イメージのサムネイル⽣成やビデオの変換 ✤ ドキュメントのメタデータをインデックス化 ✤ ログの処理 ✤ メディアコンテンツのバリデーション 元画像 サムネイル画 像 1 2 3 1.ファイルストレージを 提供するAmazon S3 2.処理ロジックを提供す るAWS Lambda
  58. 58. AWS 導⼊事例:株式会社スクウェア・エニックス ✤ ドラゴンクエストⅩ ✤ ゲーム内で写真撮影し、Lambdaでサムネイル画像作成や コピーライトの追加加⼯ ✤ 処理時間が数時間→10 数秒で完了 ✤ 同じ処理をオンプレミスと⽐べ 20 分の 1 程度まで削減 “AWS Lambda の効果は劇的でした。今まで数時間かかっていた画像処理がわ ずか 10 数秒で完了しました。コストに関しても、同じ処理をオンプレミスで ⾏う場合と⽐べ 20 分の 1 程度にまで削減することができました。 AWS Lambda にはそもそもリソースが⾜りなくなるという発想がありません。これ はオンプレミスでは真似のできないものです。” 縣 ⼤輔⽒ 第 6 ビジネス・ディビジョン テクニカルディレクター
  59. 59. Webバックエンドの場合 AP (EC2) DB (RDS) LB (ELB) Web (EC2) Static Contents (S3) ブラウザ/モバイル CDN (CloudFront)
  60. 60. サーバレススタックで置き換えると ブラウザ/モバイル API Gateway AWS Lambda DynamoDB etc S3CloudFront AWSによるマネージ (フルマネージド)
  61. 61. Amazon API Gateway 統⼀化されたAPIの作成と管理 APIの定義とホスティング クラウド上のリソースへの アクセス認証 AWSのAuthを活⽤ バックエンド保護のための DDoS対策やスロットリング ネットワークトラフィックの管理
  62. 62. Serverless = No servers to manage and scale
  63. 63. サーバレスのメリット ✤ サーバレスはバックエンドのアウトソース ⎻ サーバサイドやインフラがわからないフロントエンジニアだけでシステムを実 現することも可能 ⎻ バックエンド側のコードとサーバが減るため開発運⽤コストが最⼩化 ⎻ ⾃分の書いたコードをすぐ試せる、トライ&エラーが容易 ⎻ サービスプロバイダによってマネージされ、スケーラビリティやキャパシティ、 セキュリティの⼼配が不要 ⎻ ⾮常にコスト効率化が⾼く、多くの場合コスト減が⾒込める ✤ 開発者がビジネスにフォーカスできる
  64. 64. You donʼt do that, we do that.
  65. 65. (注)API Gateway+Lambdaが向くもの/向かないもの ✤ 向くもの ⎻ シンプル(単機能に近い)WebアプリのAPI ⎻ マイクロサービス ✤ 向かないもの ⎻ 複雑なモノリシックアプリケーション ※モノリシックが悪いと⾔っているのではないので誤解しないように
  66. 66. サーバレスのエコシステム Serverless Framework Claudia.js APEX Python Serverless Microframework Build, CI/CD ロギングとモニタリング 開発とデプロイ sumologic
  67. 67. DEMO: Serverlessを使ったJava APIの作成と公開
  68. 68. クラウド上でのアプリケーションの基本 ✤ 障害を前提としたデザイン(Design for failure) ✤ 疎結合 ✤ 弾⼒性の実装 ✤ 全てのレイヤでセキュリティを担保 ✤ 並列処理 ✤ ワークロードにあわせてデータベースを使い分ける
  69. 69. The Twelve-Factor App ✤ モダンなWebアプリケーション開発のための⽅法論 ✤ 直接的にクラウドと関連する話しではないが⼀読しておくべき ✤ URL http://12factor.net/ http://12factor.net/ja/(⽇本語訳)
  70. 70. まとめ ✤ Javaとクラウド ⎻ Java SDKとAPIを使ってプログラマブルに ⎻ Javaアプリケーションを実⾏する⽅法は複数ある ✤ Javaアプリの実⾏ ⎻ ベーシックなEC2からLambdaを使ったサーバレスまで ⎻ 適材適所・ワークロードや状況によってサービスを使い分ける ✤ クラウドを最⼤限に活かすには、クラウド上でのアプリ開発の基本に 従うこと
  71. 71. AWS re:Invent 2016 Serverless Follow Up ✤ AWS re:InventのServerlessにフォーカスしたフォローアップイベント ⎻ 12/7(⽔)19時〜 ⎻ アマゾンジャパン(とサテライト会場) ✤ 登録は以下のURLから http://aws-serverless.connpass.com/event/42950/ ✤ 当⽇現地に来れない⽅のためにストリーミング配信も⽤意しました 登録はこちら ⇒ http://aws-serverless.connpass.com/event/45295/
  72. 72. Part1 http://qiita.com/advent-calendar/2016/serverless Part2 http://qiita.com/advent-calendar/2016/serverless2

×