JJUG CCC 2022 Spring の登壇資料です。AWS でJava アプリ実行する方法について、ご紹介しています。
© 2022, Amazon Web Services, Inc. or its affiliates.© 2022, Amazon Web Services, Inc. or its affiliates.Java アプリとAWS の良い関係AWS でJava アプリを実⾏する⼀番簡単な⽅法教えます宇賀神 みずき、下川 賢介、⾦森 政雄ソリューションアーキテクトアマゾン ウェブ サービス ジャパン合同会社
View Slide
• ⽇常に⾝近なテーマでAWSを試せるハンズオン• 初⼼者向け解説コンテンツ• グラレコでAWSサービス解説• クラウド最新技術動向の解説記事メールメンバー登録で、毎⽉クレジットコードを受け取ることもできます。builders.flash ~デベロッパーのための AWS 公式ウェブマガジン~AWS のエンジニアたちによる楽しみながら学べる 最新記事を毎⽉掲載 !https://go.aws/3miM3Os
© 2022, Amazon Web Services, Inc. or its affiliates.こんにちは!宇賀神 みずき@syobochim⾦森 政雄@masaosaan下川 賢介@_kensh
© 2022, Amazon Web Services, Inc. or its affiliates.このセッションの対象者• Javaを使ったアプリケーション開発をしている• アプリケーションを簡単に公開したい• AWSのことはなんとなく知ってる / 興味がある• インフラの管理はしたくない 🧑💻👩💻✨
© 2022, Amazon Web Services, Inc. or its affiliates.このセッションのゴール• AWSでJavaのアプリケーションを簡単に開発 / 公開する⽅法がわかる!• JavaのアプリケーションをAWSを活⽤してより良くしていくための⽅法がわかる!AWSでJava良さそう!使ってみるか!って思っていただけると嬉しいです!
© 2022, Amazon Web Services, Inc. or its affiliates.クラウドを使うって…開発が楽になるとは⾔うけど…• Kubernetesとか覚えないとダメなんでしょ?それはハードルが⾼いし…• AWSのサービスっていっぱいあってよくわからない…• AWSのサンプルもNode.jsとかPythonばっかりじゃない?• 仮想マシンを今更使うのも…• ネットワークの設定とかも⾯倒…🤔結局アプリ開発者がやるのは⼤変そう…
© 2022, Amazon Web Services, Inc. or its affiliates.もっとッッッッッッ簡単にッッッッッッ⼿早くッッッッッッいい感じにッッッ動かしたいッッッッ!!!!!!!
© 2022, Amazon Web Services, Inc. or its affiliates.AWS サービスを組み合わせてインフラを構築🙆 柔軟性は高いVPC (ネットワーク)Fargate (コンピュート)ECS (オーケストレーション)ALB (ロードバランサ)AWS Auto Scaling (オートスケール)CodeBuild (CI/CD)😅 手間がかかる
© 2022, Amazon Web Services, Inc. or its affiliates.• ⼿元で動くアプリケーションを⼿軽にクラウド上にデプロイしたい• アプリケーションを動かしたいのであってインフラを組み⽴てたいわけではない• AWS おすすめの構成であらかじめ出来上がったインフラを使いたい• ソースコードやコンテナイメージをプッシュしたらそのままデプロイJava開発者の皆さんがやりたいこと
© 2022, Amazon Web Services, Inc. or its affiliates.VPC (ネットワーク)Fargate (コンピュート)ECS (オーケストレーション)ALB (ロードバランサ)AWS Auto Scaling (オートスケール)CodeBuild (CI/CD)
© 2022, Amazon Web Services, Inc. or its affiliates.AWS App Runnerインフラや AWS についての経験がなくても、コンテナ化されたウェブアプリケーションや API を簡単かつ迅速に AWS 上で動かせるサービス構築済みのインフラにすぐにデプロイ
© 2022, Amazon Web Services, Inc. or its affiliates.ソースコードリポジトリ既存ツールを用いたコンテナイメージのビルドコンテナイメージをECR にプッシュ開発チームApp Runner によるアプリケーションのビルド自動実行アプリケーションのデプロイorAWS Copilot CLI からのデプロイにも対応柔軟なアプリケーションのビルドとデプロイ
© 2022, Amazon Web Services, Inc. or its affiliates.App Runnerを使えばアプリをサクッと公開できる!AWS App Runner
© 2022, Amazon Web Services, Inc. or its affiliates.こんな時はどうすればいい?例)ショッピングサイトで画像をアップロードしたらスマホ⽤・PC⽤にリサイズしたい・アップロード処理の中で画像をリサイズする?・夜間にバッチ処理で⼀括リサイズする?
© 2022, Amazon Web Services, Inc. or its affiliates.サーバーレスで⾮同期処理を簡単に追加できる!AWS App RunnerAmazon S3AWSLambda例えば画像をAmazon S3に格納してそこからAWS Lambdaを呼び出す画像のリサイズ
© 2022, Amazon Web Services, Inc. or its affiliates.AWS Lambda• サーバーのプロビジョニング/管理なしでプログラムを実⾏できるサービス• コードの実⾏やスケーリングに必要なことは、Lambda 側で実施するので開発者の⽅はコードを書くことにより集中できる• リクエストベースの料⾦体系実⾏回数(無料枠あり)実⾏時間(単価は確保したメモリによる)(無料枠あり)https://go.aws/3mXNy4Q参考) AWS Lambda の料⾦
© 2022, Amazon Web Services, Inc. or its affiliates.https://xxxxx.execute-api.<>.amazonaws.com/Prod/構成・設定- URL- 認証- キャッシュ- 関数紐付け※ デフォルトURLカスタムURL設定可能public class App implements RequestHandlerAPIGatewayProxyResponseEvent> {public APIGatewayProxyResponseEvent handleRequest(finalAPIGatewayProxyRequestEvent input, final Context context) {Map headers = new HashMap<>();headers.put("Content-Type", "application/json");headers.put("X-Custom-Header", "application/json");APIGatewayProxyResponseEvent response = newAPIGatewayProxyResponseEvent().withHeaders(headers);try {final String pageContents =this.getPageContents("https://checkip.amazonaws.com");String output = String.format("{ ¥"message¥": ¥"hello world¥", ¥"location¥":¥"%s¥" }", pageContents);return response.withStatusCode(200).withBody(output);} catch (IOException e) {return response.withBody("{}").withStatusCode(500);}}private String getPageContents(String address) throws IOException{URL url = new URL(address);try(BufferedReader br = new BufferedReader(newInputStreamReader(url.openStream()))) {return br.lines().collect(Collectors.joining(System.lineSeparator()));}}}※ Java の場合getAllItemsFunction- テーブル- データ- テーブル- データorRDSAWS LambdaDynamoDB
© 2022, Amazon Web Services, Inc. or its affiliates.AWS Lambda のスケールの仕組みf(x) = {…}g(x) = {…}h(x) = {…}f(x)g(x)h(x)リソース管理(cpu/ memory/ version)f(x)リトライ管理ログ出力トレース管理g(x) h(x)API呼び出しイベントデータ変更イベントファイル配置イベントデプロイメント管理Amazon API GatewayAmazon DynamoDB Amazon S3
© 2022, Amazon Web Services, Inc. or its affiliates.SAM による Serverless 構築の流れSAMtemplate CloudFormationAWSリソースロード 作成/変更/削除トランスパイルSAMCloudFormationStack
© 2022, Amazon Web Services, Inc. or its affiliates.AWS SAM とは?AWS SAM transform AWS SAM CLI• リソースとイベントソースマッピングを表現するための短縮構⽂• サーバーレスアプリケーションのコード (IaC) としてのインフラストラクチャを提供• サーバーレスアプリケーションのローカル開発、デバッグ、ビルド、パッケージ化、デプロイのためのツールを提供AWSでサーバーレスアプリケーションを構築するためのオープンソースのフレームワーク → 2つの要素で構成
© 2022, Amazon Web Services, Inc. or its affiliates.AWS SAM CLI1) アプリケーションのひな形を⽣成2) ローカル環境でビルド3) ビルド後にAWS へデプロイSAM CLI$ sam init --runtime java11$ cd sam-app$ sam build$ sam deploy --guided
© 2022, Amazon Web Services, Inc. or its affiliates.SAM による Serverless 構築の流れSAMtemplate CloudFormationAWSリソースロード 作成/変更/削除トランスパイルSAMCloudFormationStack$ sam init $ sam build $ sam deploy
© 2022, Amazon Web Services, Inc. or its affiliates.AWS SAM CLI での ローカルテスト1. ローカル起動用の Dummy Event データ生成2. ローカルでLambdaを eventデータを指定して実行SAM CLI$ sam local invoke -e event.json$ sam local generate-event ¥apigateway aws-proxy ¥--path datadog_report ¥--method GET > event.jsonevent.json
© 2022, Amazon Web Services, Inc. or its affiliates.[再掲] サーバーレスで⾮同期処理を簡単に追加できる!AWS App RunnerAmazon S3AWSLambda例えば画像をAmazon S3に格納してそこからAWS Lambdaを呼び出す画像のリサイズ
© 2022, Amazon Web Services, Inc. or its affiliates.Prediction One: AI-supported software development takes holdSoftware development is a creative process, but one that has many repetitivetasks. In 2022, ML will begin to play a major role in augmenting softwaredevelopers’ workstreams, helping them create more secure and reliable code.ソフトウェア開発はクリエイティブなプロセスですが、多くの繰り返し作業があります。2022年には、ソフトウェア開発者のワークストリームを強化し、より安全で信頼性の高いコードの作成を支援する上で、MLが大きな役割を果たすようになり始めていくでしょう。「Tech Predictions for 2022 and Beyond 」 Werner Vogels (CTO, Amazon.com)https://www.allthingsdistributed.com/2021/12/tech-prediction-for-2022-and-beyond.html
© 2022, Amazon Web Services, Inc. or its affiliates.Amazon CodeGuruコードに⽋陥がある部分やアプリケーションで最も実⾏コストが⾼い箇所を特定し、改善⽅法含め推奨事項を⽣成する機械学習をベースとした開発者向けのサービス
© 2022, Amazon Web Services, Inc. or its affiliates.Amazon CodeGuru ProfilerAmazon CodeGuru Reviewer• アプリケーションのパフォーマンス状況を可視化し、最も実⾏コストが⾼いコード⾏を特定• 改善⽅法を提⽰することでインフラストラクチャ費⽤の削減に繋がる• 機械学習を駆使し、クリティカルな問題や発⾒が困難なバグを特定• 改善⽅法を提⽰することでコード品質の維持に繋がるCodeGuruが提供する2つの機能
© 2022, Amazon Web Services, Inc. or its affiliates.⼀般的な開発フローにおけるCodeGuruの⽴ち位置本番環境でパフォーマンスとコストにおける改善点を容易に特定Amazon CodeGuru Profiler最も実⾏コストが⾼いコード⾏の検知及び最適化実⽤的な推奨事項を⽣成するビルトインのコードレビューAmazon CodeGuru Reviewerコーディング+ レビュービルド+ テストデプロイ 計測 改善
© 2022, Amazon Web Services, Inc. or its affiliates.© 2022, Amazon Web Services, Inc. or its affiliates.Amazon CodeGuru Reviewer32
© 2022, Amazon Web Services, Inc. or its affiliates.コードレビュープロセスは煩雑であるレビュアーコードレビューPULLREQUEST承認GitHubAtlassianBitbucketAWS Cloud9AWS CodeCommit
© 2022, Amazon Web Services, Inc. or its affiliates.Amazon CodeGuru Reviewer• Amazon CodeGuru Reviewerにより、開発者は機械学習のメリットを享受し、⾃動的にベストプラクティに沿っていない問題箇所を特定することができ、本番環境に影響を与える可能性のある問題を未然に防ぐことができる• Amazon CodeGuru Reviewer ではコードの具体的な改善⽅法も推奨事項に含まれており、開発者はコード例や関連ドキュメントを参照することが可能• 開発者はAmazon CodeGuru Reviewerをコードレビュアーの⼀員としてみなすことができ、追加のソフトウェアのインストールは不要、現在のの開発ワークフローに変更なく簡単に利⽤を始められる
© 2022, Amazon Web Services, Inc. or its affiliates.コードレビュープロセスは煩雑であるコードレビューPULLREQUEST承認GitHubAtlassianBitbucketAWS Cloud9AWS CodeCommitCodeGuruReviewer
© 2022, Amazon Web Services, Inc. or its affiliates.Amazon CodeGuru Reviewer 推奨事項のサンプル• 導⼊作業はリポジトリをAmazon CodeGuruReviewerに紐付けるのみ• Pull Requestに対してCodeGuru Reviewerがコメントを残す• リポジトリ解析の場合、マネジメントコンソールもしくはAPIで結果を確認できる• 各推奨事項には改善⽅法も提⽰される
© 2022, Amazon Web Services, Inc. or its affiliates.Amazon CodeGuru Detector Library• CodeGuru Reviewer の検出項⽬が詳しく解説されているリソース集New!https://go.aws/3xC4NNQ
© 2022, Amazon Web Services, Inc. or its affiliates.Amazon CodeGuru Detector LibraryNew!各検出項目のページでは以下の情報を確認できます:• 検出項目の概要• 検出項目の重大性 (Critical, High,Medium, Low, Infor の5段階)• 関連する CWE (Common WeaknessEnumeration)• 問題が該当する実装例• 問題を回避できる実装例
© 2022, Amazon Web Services, Inc. or its affiliates.[再掲] このセッションのゴール• AWSでJavaのアプリケーションを簡単に開発 / 公開する⽅法がわかる!• JavaのアプリケーションをAWSを活⽤してより良くしていくための⽅法がわかる!AWSでJava良さそう!使ってみるか!って思っていただけると嬉しいです!
© 2022, Amazon Web Services, Inc. or its affiliates.さらに学びたい⽅は
© 2022, Amazon Web Services, Inc. or its affiliates.AWS Hands-on for Beginners• 動画にそって実際に ⼿を動かしながらAWS の使い⽅を学ぶ 無償コンテンツ• オンデマンド 形式で公開しており、いつでもどこでもご視聴いただける• 短い動画 x 5-10本 という形式でスキマ時間でも学ぶことが可能• 現在、22 のコンテンツを公開中https://go.aws/3Hvj2bX▲ 「AWS ハンズオン」で検索 orクラウド活⽤資料集 > ハンズオン資料
© 2022, Amazon Web Services, Inc. or its affiliates.Thank you!© 2022, Amazon Web Services, Inc. or its affiliates.
© 2022, Amazon Web Services, Inc. or its affiliates.© 2022, Amazon Web Services, Inc. or its affiliates.Appendix.
© 2022, Amazon Web Services, Inc. or its affiliates.© 2022, Amazon Web Services, Inc. or its affiliates.セッションに関連するAWS Blog / Builders.flash記事
© 2022, Amazon Web Services, Inc. or its affiliates.AWS Blog• AWS App2Container と AWS App Runner の統合によるモダナイゼーションシナリオの拡充URL: https://go.aws/3HEucv1• AWS App Runner の VPC ネットワーキングに Dive Deep するURL: https://go.aws/3mWK8iFBuilders.flash• ⼤量リクエストを低コストでさばく AWS Lambda 関数を JVM で実現URL: https://go.aws/3QqDXAZ• 機械学習でコードレビューを⾃動化 ! Amazon CodeGuru 3 分間クッキングURL: https://go.aws/3b9B7A3
© 2022, Amazon Web Services, Inc. or its affiliates.© 2022, Amazon Web Services, Inc. or its affiliates.もう少しだけAWS App Runner について47
© 2022, Amazon Web Services, Inc. or its affiliates.App Runner のアーキテクチャAWS App Runnerお客様のアプリケーションフロントエンド APIオーケストレーションワークフロービルド(CodeBuild)ホスティング(Fargate, VPC)ロードバランサとヘルスチェック(Envoy)カスタムドメイン(NLB)オートスケール(Request-based)CICD(Webhook, CloudWatch Events)安全なデプロイ(Blue-green)実行環境へのパッチ適用(ECR)ホストマシンへのパッチ適用(Fargate)Deployment & Application Logs(CW Logs)メトリクス(CloudWatch Metrics)暗号化(KMS)App Runner によりお客様が管理しなくてよくなるものECR public ECR privateGitHub
© 2022, Amazon Web Services, Inc. or its affiliates.オートスケール同時実⾏数*1 に応じてオートスケールしきい値とコンテナの最⼩/最⼤数を決めるだけ*1: https://go.aws/39vcGN5
© 2022, Amazon Web Services, Inc. or its affiliates.同時実⾏数について50ロードバランサーアプリケーションコンテナキューリクエストクライアント同時リクエスト数が閾値に到達スケールアウト開始キュー アプリケーションコンテナ
© 2022, Amazon Web Services, Inc. or its affiliates.コンテナインスタンス課⾦プロビジョンドインスタンスzzZアクティブインスタンス・アイドル状態のインスタンス・メモリに対して時間課金が発生・リクエスト処理中のインスタンス・CPU とメモリに対して時間課金が発生・$0.009/GB/時 ・$0.081/vCPU/時, $0.009/GB/時※ 2022 年 3 月時点の情報です※ 東京リージョンの価格です
© 2022, Amazon Web Services, Inc. or its affiliates.アクティブインスタンスコンテナインスタンスロードバランサーネットワーク (VPC)App Runner・CPU とメモリに対して時間課金が発生・オートスケールによって増減・リクエスト処理中のインスタンス
© 2022, Amazon Web Services, Inc. or its affiliates.プロビジョンドインスタンスコンテナインスタンスロードバランサーネットワーク (VPC)App Runner・アイドル状態のインスタンス・メモリに対して時間課金が発生・レイテンシを抑える狙い・オートスケール設定の最小台数zzzzzz
© 2022, Amazon Web Services, Inc. or its affiliates.© 2022, Amazon Web Services, Inc. or its affiliates.App Runner VPC サポート54
© 2022, Amazon Web Services, Inc. or its affiliates.VPC ネットワーキングモードの始め⽅• VPC コネクタを作成する§ VPC§ サブネット§ セキュリティグループ• App Runner サービスを起動するときに作成した VPC コネクタを選択するトラフィックがどう流れるかは次のスライドで👉
© 2022, Amazon Web Services, Inc. or its affiliates.VPC ネットワーキングモード56App Runner VPC Fargate VPCTaskTaskENINLBENINATGatewayECRApp RunnerRequest Routerコンテナイメージのpull は ENI 経由ENIENICustomer VPCSubnet ASubnet BENIENIFargate VPC からCustomer VPC へのルーティングはAWS Hyperplane を使用AuroraAuroraInternetGateway
© 2022, Amazon Web Services, Inc. or its affiliates.つまり VPC ネットワーキングモードの場合ネットワーク (VPC)App RunnerコンテナインスタンスPrivate subnetCustomer VPCAuroraENIAWS HyperplanePrivatesubnetCustomer VPCNAT GatewayInternetGatewayENIAWS Hyperplane
© 2022, Amazon Web Services, Inc. or its affiliates.つまり VPC ネットワーキングモードの場合ネットワーク (VPC)App RunnerコンテナインスタンスPrivate subnetCustomer VPCAuroraENIAWS HyperplanePrivatesubnetCustomer VPCNAT GatewayInternetGatewayENIAWS HyperplaneVPC ネットワーキングモードであってもコンテナはお客様の VPC で動くわけではないVPC ネットワーキングモードでコンテナからインターネットに接続する場合はVPC コネクションを作るサブネットからインターネットへの経路を準備する必要がある
© 2022, Amazon Web Services, Inc. or its affiliates.© 2022, Amazon Web Services, Inc. or its affiliates.AWS SAM Accelerate~開発中のLambda デプロイをより⾼速に~59
© 2022, Amazon Web Services, Inc. or its affiliates.SAM deploy60開発者sam build sam deployソースコードtemplate.yaml(SAMテンプレート)Amazon API GatewayAWS LambdaAWS Step Functions⾃動CFnスタックデプロイ/更新ビルドして デプロイして 待つコーディングして作成/更新SAMアプリケーションの初回デプロイ後、"ソースコード更新のみ"であっても、CloudFormationスタックの更新が必要
© 2022, Amazon Web Services, Inc. or its affiliates.SAM sync61開発者sam sync --watchソースコードAmazon API GatewayAWS LambdaAWS Step Functions「コード」の変更は各サービスAPIで更新(それ以外は従来通りCFn更新)ビルドして デプロイして 待つコーディングして更新コードの変更を監視してインクリメンタルビルド& ⾃動デプロイ(1分弱 → 数秒程度に)変更監視template.yaml(SAMテンプレート)開発者の繰り返しテスト(コード変更)における 開発体験 & 速度Up
© 2022, Amazon Web Services, Inc. or its affiliates.SAM sync: 対応リソース62Amazon API GatewayAWS LambdaAWS Step Functions対応リソース API変更対応内容ソースコード変更ASL(JSON)変更レイヤー変更OpenAPI document変更上記の組み合わせ以外は、CloudFormationスタック更新によるデプロイになる
© 2022, Amazon Web Services, Inc. or its affiliates.開発者向けの集約されたフィードバック63Amazon CloudWatch LogsAWS X-Rayログ(*) や X-Rayトレース情報 をSAMコマンドでまとめてローカル環境で表⽰> sam logs --stack-name sam-app --tail --include-traces> sam traces --tailXRay Event at (2022-01-10T21:53:23.338000) with id (1-61dc2c43-0357d27a40a73c4526d1795c) and duration (0.260s)- 0.260s - sam-app-HelloWorldFunction-1ILtd5dmAt5k [HTTP: 200]- 0.002s - sam-app-HelloWorldFunction-1ILtd5dmAt5k- 0.133s - Initialization- 0.001s - Invocation- 0.000s - Overhead2022/01/10/[$LATEST]6c0d6dbb6fe44cbda6d59690e9c0219a 2022-01-10T12:53:23.594000 START RequestId: 545340a6-1322-4e51-9070-93a60bbc4d28 Version: $LATEST2022/01/10/[$LATEST]6c0d6dbb6fe44cbda6d59690e9c0219a 2022-01-10T12:53:23.596000 Hello, SAM Accelerate!2022/01/10/[$LATEST]6c0d6dbb6fe44cbda6d59690e9c0219a 2022-01-10T12:53:23.598000 END RequestId: 545340a6-1322-4e51-9070-93a60bbc4d282022/01/10/[$LATEST]6c0d6dbb6fe44cbda6d59690e9c0219a 2022-01-10T12:53:23.598000 REPORT RequestId: 545340a6-1322-4e51-9070-93a60bbc4d28 Duration: 1.83 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 37 MBInit Duration: 133.29 msXRAY TraceId: 1-61dc2c43-0357d27a40a73c4526d1795c SegmentId: 0b30412d3e54bc5aSampled: trueNew XRay Service GraphStart time: 2022-01-10 21:53:23+09:00End time: 2022-01-10 21:53:23+09:00Reference Id: 0 - AWS::Lambda::Function - sam-app-HelloWorldFunction-1ILtd5dmAt5k - Edges: []Summary_statistics:- total requests: 1- ok count(2XX): 1- error count(4XX): 0- fault count(5XX): 0- total response time: 0.002Reference Id: 1 - client - sam-app-HelloWorldFunction-1ILtd5dmAt5k - Edges: [2]Summary_statistics:- total requests: 0- ok count(2XX): 0- error count(4XX): 0- fault count(5XX): 0- total response time: 0Reference Id: 2 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-1ILtd5dmAt5k - Edges: [0]Summary_statistics:- total requests: 1- ok count(2XX): 1- error count(4XX): 0- fault count(5XX): 0- total response time: 0.26(*) ログは Lambda関数ログ、API Gateway の REST API実行ログ, HTTP APIアクセスログ に対応
© 2022, Amazon Web Services, Inc. or its affiliates.さらさらに学びたい⽅は
© 2022, Amazon Web Services, Inc. or its affiliates.開発者のための開発者による Web セミナーシリーズAWS DevAx::connect 3rd 「rethink CI/CD」(後編)rethink CI/CD毎週⽊曜 16:00-18:006/30スペシャル6/23k8s/GitOps6/23IaC/CDK6/16ロールバック6/9CI/CDテストhttps://bit.ly/3tIcEbv
© 2022, Amazon Web Services, Inc. or its affiliates.https://go.aws/3OnsX5G