SlideShare a Scribd company logo
1 of 68
Download to read offline
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
The Twelve-Factor App で考える
AWS のサービス開発
31 October 2018
Amazon Web Services Japan Solutions Architect
Fumihiko Hata ,Yuki Chiba
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
スピーカー紹介
千葉 悠貴
アマゾン ウェブ サービス ジャパン株式会社
シニアソリューションアーキテクト
畑 史彦
アマゾン ウェブ サービス ジャパン株式会社
ソリューションアーキテクト
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
What is The Twelve-Factor App
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
The Twelve-Factor App
2011年にHerokuのエンジニアが提唱した、アプリ開発の方法論
• セットアップ自動化のために宣言的なフォーマットを使い、プロジェクト
に新しく加わった開発者が要する時間とコストを最小化する。
• 下層のOSへの依存関係を明確化し、実行環境間での移植性を最大化する。
• モダンなクラウドプラットフォーム上へのデプロイに適しており、サー
バー管理やシステム管理を不要なものにする。
• 開発環境と本番環境の差異を最小限にし、アジリティを最大化する継続的
デプロイを可能にする。
• ツール、アーキテクチャ、開発プラクティスを大幅に変更することなくス
ケールアップできる。
サービスとして動くアプリを開発しているすべての開発者が対象
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
The Twelve-Factor App
I. コードベース
バージョン管理される1つのコードベースと複数デプロイ
II. 依存関係
依存関係を明示的に宣言し分離する
III.設定
設定を環境変数に格納する
IV.バックエンドサービス
バックエンドサービスをアタッチされたリソースとして扱う
V. ビルド、リリース、実行
ビルド、リリース、実行の3つのステージを厳密に分離する
VI.プロセス
アプリを1つ又は複数のステートレスなプロセスとして実行
VII.ポートバインディング
ポートバインディングを通してサービスを公開する
VIII.並行性
プロセスモデルによってスケールアウトする
IX. 廃棄容易性
高速な起動とグレースフル停止で堅牢性を最大化する
X. 開発/本番一致
開発、ステージング、本番環境をできるだけ一致させた状態を保つ
XI. ログ
ログをイベントストリームとして扱う
XII.管理プロセス
管理タスクを1回限りのプロセスとして実行する
https://12factor.net/ja/
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
What is Cloud
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
What is Cloud
• 初期投資不要
• 使った分にだけ支払い
• 柔軟なリソースの選択
• 迅速なリソースの確保/解放
それによる素早い開発サイクル
→ システムの付加価値の向上に、より専念
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
What is Cloud
• 初期投資不要
• 使った分にだけ支払い
• 柔軟なリソースの選択
• 迅速なリソースの確保/解放
それによる素早い開発サイクル
→ システムの付加価値の向上に、より専念
インフラストラクチャは
柔軟・迅速・高コスト効率
その上で動くアプリケーションは?
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
What is Cloud
クラウド(インフラストラクチャ)には
柔軟性や機動力やコスト効果の高い仕組みが備わっている
それらを十分に活かすアプリケーション構成が
クラウドの力をさらに引き出す
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
The Twelve-Factor App
アプリケーションを疎結合にするための指針・方法論
疎結合 と クラウド の相性
疎結合なアプリケーションは・・・
• デプロイ が容易
• 起動 / 停止 / 中断 が容易
• スケールアウト / スケールイン が容易
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
The Twelve-Factor App
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
I. コードベース
バージョン管理されている1つのコードベースと
複数のデプロイ
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
I. コードベース
コードベースとアプリケーションの間には、常に1対1の関係がある。
• コードベース : アプリケーション が N : 1
→ 分散システム
• コードベース : アプリケーション が 1 : N
→ コードベースの様々なバージョンが複数のアプリケーションから参照され
る状態を管理する必要
→ コードをライブラリに分離
アプリケーションごとにただ1つのコードベースが存在するが、アプリ
ケーションのデプロイは複数存在する。
• デプロイごとに異なるバージョンがアクティブであるかもしれないが、
コードベースはすべてのデプロイを通して同一である
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
AWS CodeCommit
Secure, scalable, managed Git source control
スターンダードな Git tool が利用可能
Amazon S3 の Scalability, availability, durability
をストレージに活用
Encryption at rest with customer-specific keys
レポジトリサイズの上限なし
Post commit hooks で SNS/Lambda を呼び出し
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
II. 依存関係
依存関係を明示的に宣言し分離する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
II. 依存関係
https://12factor.net/ja/dependencies
システム全体にインストールされるパッケージが暗黙的に存在することに
決して依存しない
• すべての依存関係を 依存関係宣言 マニフェストで完全かつ厳密に宣言する
• 実行時には 依存関係分離 ツールを使って、取り囲んでいるシステムから暗黙
の依存関係が“漏れ出ない”ことを保証する
• 依存関係の指定は、本番環境と開発環境の両方に適用する
いかなるシステムツールの暗黙的な存在にも依存しない
• アプリ外のツールに依存しない(OSにプリインストールされているcurlなど)
• 将来に渡ってそのツールが環境に存在するか、互換性のあるバージョンが提供
され続けるかはわからない
• アプリケーションに必要な機能はアプリケーション内で実装する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
依存関係宣言マニフェストと依存関係分離ツール
言語 分離ツール 宣言マニフェスト
Node.js npm package.json
Ruby bundler gemfile
Python pip requirements.txt
Java mvn package pom.xml
C# NuGet .nuspec
Go dep manifest.json
SAM sam package template.yml
Docker docker build Dockerfile
Ansible ansible-playbook playbook
Infrastructure as Codeでも同様
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
SAM (Serverless Application Model)
• サーバレスアプリに最適化したAWS CloudFormationの拡張
• サーバレスアプリ用の新たなリソースタイプ
• 関数 (Lambda Function)
• API (API Gateway)
• テーブル (DynamoDB)
• CloudFormationがサポートしているすべてのものをサポート
• 既存のファンクションをSAMテンプレートとしてエクスポート可能
• オープンな仕様(Apache 2.0)
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-ct-example-use-app-spec.html
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
SAM − デプロイの流れ
Step1 :
SAMの表記方法でCloudFormation
テンプレートを作成する
Step2 :
cloudformation packageコマンドで
パッケージ化しS3バケットに格納する
Step3 :
cloudformation deployコマンドで
パッケージをデプロイする
AWSTemplateFormatVersion: '2010-09-09’
Transform: AWS::Serverless-2016-10-31
Resources:
FunctionName:
Type: AWS::Serverless::Function
Properties:
Handler: handler
Runtime: runtime
CodeUri: s3://bucketName/codepackage.zip
aws cloudformation package ¥
--template-file /path_to_template/template.yaml ¥
--s3-bucket bucket-name ¥
--output-template-file packaged-template.yaml
aws cloudformation deploy ¥
--template-file /path_to_template/packaged-template.yaml ¥
--stack-name my-new-stack ¥ --capabilities CAPABILITY_IAM
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
III. 設定
設定を環境変数に格納する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
III. 設定
アプリケーションの 「設定」 は、デプロイ(ステージング、本番、開発
環境など)の間で異なり得る唯一のもの。
• 設定をコードから厳密に分離すること
• この“設定”の定義には、アプリケーション内部の設定は 含まない
• 認証情報を漏洩させることなく、コードベースを今すぐにでもオープンソース
にすることができるか
設定を 「環境変数」 に格納する。
• 環境変数は、コードを変更することなくデプロイごとに簡単に変更できる
• 環境変数は、独自形式の設定ファイルやJava System Propertiesなど他の設定
の仕組みとは異なり、環境変数は言語やOSに依存しない標準
• 環境変数は粒度の細かい管理であり、それぞれの環境変数は互いに直交
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
AWS Systems Manager
Run Command Maintenance
Window
Inventory
State Manager Parameter Store
Patch Manager
Automation
デプロイ、構成
および管理
トラッキングと
アップデート
共有コンポーネント分類と可視化
Resource Groups
Insights
Dashboard
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Parameter Store
• 設定データ管理と機密管理のための安全な階層型ストレージ
• パスワード、データベース文字列、ライセンスコードなどのデー
タをパラメータ値として保存可能
• プレーンテキストまたは暗号化されたデータとして保存可能
• 作成時に指定した一意の名前を使用して値を参照
• Run Command, Automation, State Managerなどから参照可能
• 例:Run Commandから参照する場合
aws ssm send-command --instance-ids i-1a2b3c4d5e6f7g8 ¥
--document-name AWS-RunPowerShellScript ¥
--parameter '{"commands":["echo {{ssm:param}}"]}'
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
環境変数
• AWS Lambda 環境変数
• コンテナのプロセスに
Parameter Storeから
環境変数を経由して
「設定」を注入する例
dockerfile
ENTRYPOINT ["./entrypoint.sh"]
entrypoint.sh
export DB_HOST=$(aws ssm get-parameters ¥
--name /database/sample/host ¥
--query "Parameters[0].Value")
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
データベースへの認証情報や API キーなど
シークレットのライフサイクル管理
AWS Secrets Manager
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
IV. バックエンドサービス
バックエンドサービスをアタッチされた
リソースとして扱う
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
IV. バックエンドサービス
https://12factor.net/ja/backing-services
バックエンドサービスとはアプリケーションが通常の動作の中でネット
ワーク越しに利用するすべてのサービス
• DB、キャッシュ、NWストレージ、キュー、監視サービスなど
• 外部のAPIサービス(Twitter API、 Github APIなど)
ローカルサービスとサードパーティサービスを区別しない
• すべてのバックエンドサービスを設定に格納されたURLでアクセス可能にする
• アプリケーションのコードに変更を加えることなく、ローカルのMySQLをサー
ドパーティサービス(RDSなど)に切り替えることができるべき
リソースは自由にアタッチしたり、デタッチしたりできるように
• DBに問題が起きた場合、既存のDBをデタッチし、バックアップから復元した
DBをアタッチできるようにする
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
主なAWSのアプリバックエンドサービス
Amazon S3
99.999999999%の耐久性を持つ
容量無制限のオブジェクトストレージ
Amazon RDS
DB管理の運用負荷を軽減する
リレーショナルデータベース
Amazon DynamoDB
データ容量無制限、最大スループット
無制限のNoSQL
Amazon ElastiCache
Memcached, Redisを管理する
インメモリキャッシュ
Amazon SQS
信頼が高くスケーラブルな
メッセージキューサービス
Amazon SNS
publish-subscribe(pub-sub)型の
メッセージングサービス
Amazon Kinesis
ストリームデータ/動画をリアルタ
イムで容易に収集、処理、分析
Amazon CloudWatch
メトリクスやログの収集、可視化、
監視、検知機能を提供
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
バックエンドサービスを使う上での注意点
バックエンドサービスの遅延、停止の可能性を考慮する
• 代表的なアーキテクチャパターン
• リトライ:一時的な中断を考慮し、バックエンドへのリクエストはリトライする
• タイムアウト:長期サービス断を止めるため、リトライタイムアウトを設ける
• サーキットブレイカー:タイムアウトが頻発する場合、リクエスト自体を止める
※最近はアプリではなくサービスメッシュ層で吸収することも多い
• AWSサービスをバックエンドサービスに使う場合は、各サービスの
Rate Limitを考慮
• Rate Limitを超えるとスロットリングされる
• Rate Limitを把握し、必要に応じて上限緩和申請をおこなう
• 上限緩和ができない場合、キャッシング、キューイング、シャーディングなどの
デザインパターンを導入しバックエンドの負荷を緩和する
https://docs.aws.amazon.com/ja_jp/general/latest/gr/
aws_service_limits.html
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Exponential Backoff And Jitter
クライアント数が増えるとスロットリング時に多くのクライアントリソースを無駄にする
「1回めはN個のクライアントが競合を起こし1つだけが成功する、次はN-1個のクライアントが競合、更に次はN-2個の・・・」
→リトライに遅延(Backoff)とゆらぎ(Jitter)を導入する
https://aws.typepad.com/sajp/2015/03/backoff.html
Exponential Backoffの導入効果
Backoffを導入しない場
合クライアント数の2乗
に比例したリクエストが
発生する
Backoffを導入すると
リクエスト数は若干
改善する
スロットリングにあった
全クライアントが同じ
タイミングでリトライしている
Jitterを加えたことで
無駄なリクエスト数
が減っている
リトライタイミングが散らばり、
競合状態の収束が早まる
Jitterの導入効果
遅延はExponential(指数的)に
徐々に長くしている
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
AWS SDKでのリトライ実装例
https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-
core/src/main/java/com/amazonaws/retry/PredefinedBackoffStrategies.java
aws-sdk-java/aws-java-sdk-core/src/main/java/com/amazonaws/retry/PredefinedBackoffStrategies.java
Exponential Backoffの実装
jitterの実装
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
V. ビルド、リリース、実行
ビルド、リリース、実行の3つのステージを
厳密に分離する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
V. ビルド、リリース、実行
コードベースは3つのステージを経て、(開発環境ではない)デプロイへ
と変換される
1. ビルド:コードリポジトリを実行可能な塊へと変える変換
2. リリース:上記の成果物を受け取り、それをデプロイの現在の「設定」と結合
3. 実行(ランタイム):選択されたリリースに対して、アプリケーションのいく
つかのプロセスを起動する
ビルド、リリース、実行の3つのステージを厳密に分離する。
• 一度作られたリリースは変更することはできない
• ビルドステージは開発者によって駆動されるが、
実行ステージは自動で開始されうる
• 実行ステージはできるだけ可変部分を持たないようにするべき
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
AWS Code Services
AWS CodeCommit
• セキュア、スケーラブルなGit互換のリポジトリサービス
• スタンダードなGit Toolからアクセス可能
• PushなどのイベントをトリガーにSNS/Lambdaを呼び出し可能
AWS CodeBuild
• スケーラビリティに優れたビルドサービス
• ソースのコンパイル、テスト、パッケージ生成をサポート
• Dockerイメージの作成も可能
AWS CodeDeploy
• S3またはGitHub上のコードをあらゆるインスタンスにデプロイ
• デプロイを安全に実行するための様々な機能を提供
• In-place(ローリング) およびBlue/Greenのデプロイをサポート
AWS CodePipeline
• リリースプロセスのモデル化と見える化を実現
• カスタムアクションによる柔軟なパイプライン作成が可能
• 様々なAWSサービスや3rdパーティ製品との統合をサポート
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VI. プロセス
アプリケーションを1つもしくは複数の
ステートレスなプロセスとして実行する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VI. プロセス
https://12factor.net/ja/processes
アプリプロセスはステートレスかつシェアードナッシングに
• 永続化する必要のあるすべてのデータは、ステートフルなバックエンドサービ
スに格納する(DB、キャッシュエンジンなど)
プロセスのメモリ空間やファイルシステムは、短い単一のトランザクショ
ン内でのキャッシュとして利用してもOK
• メモリやディスクにキャッシュされたものが将来のリクエストやジョブにおい
て利用できることは保証されない
• プロセスが再起動するとメモリやtmpファイルは消えうる
スティッキーセッションは利用しない
• セッションはバックエンドサービスに格納する(redis、memcacheなど)
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
ステートレス/シェアードナッシングアーキテクチャ
データストアはバックエンドサービスに
• 構造化データ:RDS
• キャッシュ、セッション情報:ElastiCache
• KVS:DynamoDB
• ファイルオブジェクト:S3
ELBのスティッキーセッションは利用しない
共有データストアを作らない
• 極力複数プロセスから共有のNFSマウントなどはしない
• 共有するリソースはバックエンドサービスとして独立
してスケーラビリティを担保できることを確認する
Web/AP
RDS
ElastiCache
(Redis)
S3(コンテンツ配信)
S3(log)
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VII. ポートバインディング
ポートバインディングを通してサービスを公開する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VII. ポートバインディング
Webアプリケーションは ポートにバインドすることでHTTPをサービス
として公開し、 そのポートにリクエストが来るのを待つ。
• コンテナが実行環境にWebサーバーランタイムを注入することを頼りにしない
• リクエストを処理するための実行環境との契約は、ポートをバインドすること
である
ポートバインディングの方法によって、あるアプリケーションが他のアプ
リケーションにとってのバックエンドサービスになれる。
• ポートバインディングによって公開されるサービスはHTTPだけではない
• ほぼすべてのサーバーソフトウェアは、ポートをバインドするプロセスを用い
て動作し、リクエストが来るのを待つ
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VII. ポートバインディング
コンポーネント間のやり取りをポートバインディングで分離
→ 通信が TCP/UDP のレベルで分離される
(例えば、Shared Memory 使ったプロセス間通信では
コンポーネント間がより密結合になってしまう)
あるアプリケーションが他のアプリケーションにとっての
バックエンドサービスになることができる
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VII. ポートバインディング
Elastic Load
Balancing
client
Port Binding
Port
Binding
例)共有メモリ
プロセス間通信
Port Binding
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VIII. 並行性
プロセスモデルによってスケールアウトする
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
VIII. 並行性
https://12factor.net/ja/concurrency
アプリケーションはプロセス単位でスケールさせる
• 1プロセスをマルチスレッドにすることでスケールを担保するのではなく、プ
ロセス単位でスケールアウトする
• マルチスレッドアプリケーションを禁止しているわけではない
アプリケーションは垂直方向ではなく水平方向でスケールさせる
• シェアードナッシングで水平分割可能なTwelve-Factor Appプロセスの性質は、
スケールアウトが容易
アプリプロセスはデーモン化しない、PIDファイルを書き出さない
• プロセスの管理(出力ストリーム、プロセスクラッシュの対応、ユーザーによる
再起動への対応)はOSのプロセスマネージャー(systemdなど)に任せる
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
水平スケーリングへの対応
アプリケーションインスタンス/コンテナは原則AutoScaling
• サイズ維持 : Auto Healingの用途
• 手動スケーリング:必要なときにサイズを手動で変更
• 動的スケーリング:負荷などのメトリクスをベースにスケーリング
• スケジュールベース:定義したスケジュールに基づいてスケーリング
平常時は負荷傾向が予測できる
⇩
スケジュールベース
予定された大量負荷への対策
⇩
+手動スケーリング
緩やかな負荷変動の対策
⇩
+動的スケーリング
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
スケールアウトへの対応
• BootStrap処理、ヘルスチェックパスの実装
• クールダウン期間の考慮
• スパイクトラフィックはAuto Scalingでは救いきれない点は注意
スケールインへの対応
• ログの待避、グレースフルシャットダウンを考慮
• どうしてもすぐに落とせないリソースはライフサイクルフックを実装
水平スケーリングへの対応
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
IX. 廃棄容易性
高速な起動とグレースフルシャットダウンで
堅牢性を最大化する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
IX. 廃棄容易性
プロセス は 廃棄容易 である、すなわち即座に起動・終了することがで
きる。
• プロセスは、 起動時間を最小化する よう努力するべきである
• 素早く柔軟なスケールと、コード や 設定 に対する変更の素早いデプロイを容
易にし、本番デプロイの堅牢性を高める
SIGTERMシグナルを受け取ったときに、グレースフルにシャットダウ
ンする。
• Webプロセスの場合、グレースフルシャットダウンは、サービスポートのリッ
スンを中止し処理中のリクエストが終了するまで待ち、シャットダウンするこ
とで実現される
• ワーカープロセスの場合、グレースフルシャットダウンは、処理中のジョブを
ワーカーキューに戻すことで実現される
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
IX. 廃棄容易性
• たいていのWebアプリケーションフレームワークや
Webサーバはきちんと対応されているので気にする必要
がない?
• 例えば、バッチのアプリケーションは、長い実行時間の
途中で速やかに安全に中止や中断をハンドリングできる
設計になっていますか?
• キューイング、ワークフローの活用
• Amazon SQS, AWS StepFunctionsなど
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Spot Instance
• オンデマンド
• スタンダードな時間課金型インスタンス
• リザーブドインスタンス
• 1年間または3年間の利用予約をすることで25〜70%前後の割引
• スポットインスタンス
• 使われていないEC2インスタンスに入札して格安利用
• 最大90%程度の大幅コストカットが可能
• Dedicated Host
• お客様専用の物理サーバを確保
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Spot Instance
• 使われていないEC2インスタンスに入札して格安利用
ただし、スポット価格高騰あるいはスポットインスタンス
枯渇による強制ターミネートがありうる
コスト削減 計算結果をより
速く
簡単に利用 柔軟なリソース
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
X. 開発/本番一致
開発、ステージング、本番環境をできるだけ
一致させた状態を保つ
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
X. 開発/本番一致
https://12factor.net/ja/dev-prod-parity
継続的デプロイしやすいよう開発環境と本番環境のギャップを小さく保つ
• 時間のギャップ: 開発者が編集したコードが本番に反映されるまでを短く
• 人材のギャップ:コードを書いた開発者はそのコードのデプロイに関わる
• ツールのギャップ: 開発環境と本番環境でできるだけ同じツールを使う
バックエンドサービスも開発/本番をできるだけ一致させる
• 開発環境ではSQLiteを使い、本番ではPostgreSQLを使うなどをしない
• バックエンドサービスの違いは、開発環境では動作するアプリが本番環境で動
かいない、という状況を招く
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
開発環境と本番環境のギャップを小さく
時間のギャップ
• CI/CDパイプラインを導入し継続的にインテグレーション/デプロイする
人材のギャップ
• CI/CDパイプラインでコード開発者が自分でデプロイする
• コードのコミットとデプロイの権限をわける必要がある場合、Dockerイ
メージ、AMI、CloudFormationテンプレートなど同一性が担保できるコ
ンポーネントを分界点として受け渡す
ツールのギャップ
• 開発環境とのポータビリティ→Dockerが得意とするところ
• 開発環境でモックとして動くAWSサービス:
DynamoDBローカル、SAMローカル、LocalStack
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
XI. ログ
ログをイベントストリームとして扱う
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
ログ
ログは、すべての実行中のプロセスとバックエンドサービスの出力スト
リームから収集されたイベントが、集約されて時刻順に並べられたスト
リームである。
• ログは一般的にディスク上のファイルに書き込まれる
• しかしこれは出力フォーマットの一つに過ぎない
• ログには固定の始まりと終わりはなく、アプリケーションが稼動している限り
流れ続ける
アプリケーションの出力ストリームの送り先やストレージについて一切関
知しない。
• アプリケーションのイベントストリームは、ファイルに送られたり、ターミナ
ルでtailを使ってリアルタイムに見られたりする
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Amazon ECS Logging Driver
• Amazon ECS がサポートしている Docker の Logging Driver
• json-file, syslog, journald, gelf, fluentd, awslogs,
• awslogs
• Amazon CloudWatch Logs にログを送信
• Amazon CloudWatch Logs から他サービスへ容易に連携
• fluentd
• fluentd の in_forward にログを送信
• OSS の豊富なプラグインを使って多くのデータストアや
サービスへログを転送可能
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
ログを awslogs 経由で収集・分配
Amazon CloudWatch Logs
Amazon CloudWatch Logs
Amazon CloudWatch Logs
Amazon CloudWatch Logs
Amazon S3
Amazon Kinesis
AWS Lambda
Amazon Elasticsearch Service
Amazon ECS 保存
ストリーム
処理
検索
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
XII. 管理プロセス
管理タスクを1回限りのプロセスとして実行する
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
XII. 管理プロセス
https://12factor.net/ja/admin-processes
管理プロセス=アプリのための1回限りの管理・メンテナンス用のタスク
• データベースのマイグレーション(rake db:migrateなど)
• 特定の修正のための一回限りのスクリプト(DBの特定レコードの修正など)
管理タスクは1回限りのプロセスとして、長時間実行されるプロセスと全
く同じ環境で実行する
• 管理プロセスは、あるリリースに対して実行され、そのリリースに対して実行
されるすべてのプロセスと同じコードベースと設定を使う
• 管理用のコードは、アプリケーションコードと一緒にデプロイする
• アプリと同じ依存関係分離ツールを使う
• RubyのWebプロセスが`bundle exec thin start`を使うのであれば、DBマイグレーションには
`bundle exec rake db:migrate`を使う、など
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
管理タスクは1回限りのプロセスとして実行する
悪い例 良い例
db:migrateを手動で実行
db:migrateを実行するためのスクリプトを作成
しデプロイパイプラインに含める
ecs:UpdateService時にアプリ起動スクリプト
内でdb:migrateを実行し、同じスクリプトの中
でRails サーバーを起動
db:migrateを実行するタスクをecs:RunTask
それが成功したら別のデプロイステージに進み、
ecs:UpdateServiceでRailsサーバーコンテナを
アップデート
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Wrap up
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Twelve-Factor
I. コードベース
バージョン管理される1つのコードベースと複数デプロイ
II. 依存関係
依存関係を明示的に宣言し分離する
III.設定
設定を環境変数に格納する
IV.バックエンドサービス
バックエンドサービスをアタッチされたリソースとして扱う
V. ビルド、リリース、実行
ビルド、リリース、実行の3つのステージを厳密に分離する
VI.プロセス
アプリを1つ又は複数のステートレスなプロセスとして実行
VII.ポートバインディング
ポートバインディングを通してサービスを公開する
VIII.並行性
プロセスモデルによってスケールアウトする
IX. 廃棄容易性
高速な起動とグレースフル停止で堅牢性を最大化する
X. 開発/本番一致
開発、ステージング、本番環境をできるだけ一致させた状態を保つ
XI. ログ
ログをイベントストリームとして扱う
XII.管理プロセス
管理タスクを1回限りのプロセスとして実行する
https://12factor.net/ja/
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
The Twelve-Factor App
アプリケーションを疎結合にするための指針・方法論
疎結合 と クラウド の相性
疎結合なアプリケーションは・・・
• デプロイ が容易
• 起動 / 停止 / 中断 が容易
• スケールアウト / スケールイン が容易
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
The Twelve-Factor App
アプリケーションを疎結合にするための指針・方法論
疎結合 と クラウド の相性
疎結合なアプリケーションは・・・
クラウドの力を最大限に引き出す
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Appendix
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
合わせて読みたい
Architecting for the Cloud (2010)
 Decouple your components
コンポーネントを疎結合にする
 Design for failure
障害に備えた設計する
 Implement elasticity
伸縮自在性を実装する
 Think parallel
並列化する
https://s3.amazonaws.com/awsmedia/jp/wp/AWS_WP_Cloud_
BestPractices_JP_v20110531.pdf
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
© 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Thank You!

More Related Content

What's hot

What's hot (20)

AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
20190514 AWS Black Belt Online Seminar Amazon API Gateway
20190514 AWS Black Belt Online Seminar Amazon API Gateway 20190514 AWS Black Belt Online Seminar Amazon API Gateway
20190514 AWS Black Belt Online Seminar Amazon API Gateway
 
20200721 AWS Black Belt Online Seminar AWS App Mesh
20200721 AWS Black Belt Online Seminar AWS App Mesh20200721 AWS Black Belt Online Seminar AWS App Mesh
20200721 AWS Black Belt Online Seminar AWS App Mesh
 
20191002 AWS Black Belt Online Seminar Amazon EC2 Auto Scaling and AWS Auto S...
20191002 AWS Black Belt Online Seminar Amazon EC2 Auto Scaling and AWS Auto S...20191002 AWS Black Belt Online Seminar Amazon EC2 Auto Scaling and AWS Auto S...
20191002 AWS Black Belt Online Seminar Amazon EC2 Auto Scaling and AWS Auto S...
 
20190130 AWS Black Belt Online Seminar AWS Identity and Access Management (AW...
20190130 AWS Black Belt Online Seminar AWS Identity and Access Management (AW...20190130 AWS Black Belt Online Seminar AWS Identity and Access Management (AW...
20190130 AWS Black Belt Online Seminar AWS Identity and Access Management (AW...
 
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
 
20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation 20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation
 
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
20201111 AWS Black Belt Online Seminar AWS CodeStar & AWS CodePipeline
 
20190326 AWS Black Belt Online Seminar Amazon CloudWatch
20190326 AWS Black Belt Online Seminar Amazon CloudWatch20190326 AWS Black Belt Online Seminar Amazon CloudWatch
20190326 AWS Black Belt Online Seminar Amazon CloudWatch
 
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
 
20201028 AWS Black Belt Online Seminar Amazon CloudFront deep dive
20201028 AWS Black Belt Online Seminar Amazon CloudFront deep dive20201028 AWS Black Belt Online Seminar Amazon CloudFront deep dive
20201028 AWS Black Belt Online Seminar Amazon CloudFront deep dive
 
20210216 AWS Black Belt Online Seminar AWS Database Migration Service
20210216 AWS Black Belt Online Seminar AWS Database Migration Service20210216 AWS Black Belt Online Seminar AWS Database Migration Service
20210216 AWS Black Belt Online Seminar AWS Database Migration Service
 
20191023 AWS Black Belt Online Seminar Amazon EMR
20191023 AWS Black Belt Online Seminar Amazon EMR20191023 AWS Black Belt Online Seminar Amazon EMR
20191023 AWS Black Belt Online Seminar Amazon EMR
 
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
AWS Black Belt Online Seminar 2017 AWS Elastic BeanstalkAWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
 
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
20190806 AWS Black Belt Online Seminar AWS Glue
20190806 AWS Black Belt Online Seminar AWS Glue20190806 AWS Black Belt Online Seminar AWS Glue
20190806 AWS Black Belt Online Seminar AWS Glue
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
20190424 AWS Black Belt Online Seminar Amazon Aurora MySQL
20190424 AWS Black Belt Online Seminar Amazon Aurora MySQL20190424 AWS Black Belt Online Seminar Amazon Aurora MySQL
20190424 AWS Black Belt Online Seminar Amazon Aurora MySQL
 
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
 

Similar to The Twelve-Factor Appで考えるAWSのサービス開発

AWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツールAWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツール
Amazon Web Services Japan
 

Similar to The Twelve-Factor Appで考えるAWSのサービス開発 (20)

Serverless Application Security on AWS
Serverless Application Security on AWSServerless Application Security on AWS
Serverless Application Security on AWS
 
20180619 AWS Black Belt Online Seminar データレイク入門: AWSで様々な規模のデータレイクを分析する効率的な方法
20180619 AWS Black Belt Online Seminar データレイク入門: AWSで様々な規模のデータレイクを分析する効率的な方法20180619 AWS Black Belt Online Seminar データレイク入門: AWSで様々な規模のデータレイクを分析する効率的な方法
20180619 AWS Black Belt Online Seminar データレイク入門: AWSで様々な規模のデータレイクを分析する効率的な方法
 
開発者におくるサーバーレスモニタリング
開発者におくるサーバーレスモニタリング開発者におくるサーバーレスモニタリング
開発者におくるサーバーレスモニタリング
 
Amazon Kinesis Familyを活用したストリームデータ処理
Amazon Kinesis Familyを活用したストリームデータ処理Amazon Kinesis Familyを活用したストリームデータ処理
Amazon Kinesis Familyを活用したストリームデータ処理
 
AWS Black Belt Online Seminar 2018 ReInvent recap security other
AWS Black Belt Online Seminar 2018 ReInvent recap security otherAWS Black Belt Online Seminar 2018 ReInvent recap security other
AWS Black Belt Online Seminar 2018 ReInvent recap security other
 
Serverless backendformobilegame and_aws-appsync_gamingtechnight-2
Serverless backendformobilegame and_aws-appsync_gamingtechnight-2Serverless backendformobilegame and_aws-appsync_gamingtechnight-2
Serverless backendformobilegame and_aws-appsync_gamingtechnight-2
 
GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)
 
Best Practices for Running PostgreSQL on AWS
Best Practices for Running PostgreSQL on AWSBest Practices for Running PostgreSQL on AWS
Best Practices for Running PostgreSQL on AWS
 
Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2
 
Security Operations and Automation on AWS
Security Operations and Automation on AWSSecurity Operations and Automation on AWS
Security Operations and Automation on AWS
 
20180425 AWS Black Belt Online Seminar Amazon Relational Database Service (Am...
20180425 AWS Black Belt Online Seminar Amazon Relational Database Service (Am...20180425 AWS Black Belt Online Seminar Amazon Relational Database Service (Am...
20180425 AWS Black Belt Online Seminar Amazon Relational Database Service (Am...
 
Day 1 with Amazon Web Services - AWSご利用開始時に最低限おさえておきたい10のこと
Day 1 with Amazon Web Services - AWSご利用開始時に最低限おさえておきたい10のことDay 1 with Amazon Web Services - AWSご利用開始時に最低限おさえておきたい10のこと
Day 1 with Amazon Web Services - AWSご利用開始時に最低限おさえておきたい10のこと
 
[PGConf.ASIA 2018]Deep Dive on Amazon Aurora with PostgreSQL Compatibility
[PGConf.ASIA 2018]Deep Dive on Amazon Aurora with PostgreSQL Compatibility[PGConf.ASIA 2018]Deep Dive on Amazon Aurora with PostgreSQL Compatibility
[PGConf.ASIA 2018]Deep Dive on Amazon Aurora with PostgreSQL Compatibility
 
(AWS DevOps祭り 2018) AWS Management Toolsサービスアプデートのご紹介
(AWS DevOps祭り 2018) AWS Management Toolsサービスアプデートのご紹介(AWS DevOps祭り 2018) AWS Management Toolsサービスアプデートのご紹介
(AWS DevOps祭り 2018) AWS Management Toolsサービスアプデートのご紹介
 
20180508 AWS Black Belt Online Seminar AWS Greengrassで実現するエッジコンピューティング
20180508 AWS Black Belt Online Seminar AWS Greengrassで実現するエッジコンピューティング20180508 AWS Black Belt Online Seminar AWS Greengrassで実現するエッジコンピューティング
20180508 AWS Black Belt Online Seminar AWS Greengrassで実現するエッジコンピューティング
 
20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services
 
Innovation and Startups Today
Innovation and Startups TodayInnovation and Startups Today
Innovation and Startups Today
 
AWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツールAWS における Microservices Architecture と DevOps を推進する組織と人とツール
AWS における Microservices Architecture と DevOps を推進する組織と人とツール
 
202202 AWS Black Belt Online Seminar AWS SaaS Boost で始めるSaaS開発⼊⾨
202202 AWS Black Belt Online Seminar AWS SaaS Boost で始めるSaaS開発⼊⾨202202 AWS Black Belt Online Seminar AWS SaaS Boost で始めるSaaS開発⼊⾨
202202 AWS Black Belt Online Seminar AWS SaaS Boost で始めるSaaS開発⼊⾨
 
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
 

More from Amazon Web Services Japan

More from Amazon Web Services Japan (20)

202205 AWS Black Belt Online Seminar Amazon VPC IP Address Manager (IPAM)
202205 AWS Black Belt Online Seminar Amazon VPC IP Address Manager (IPAM)202205 AWS Black Belt Online Seminar Amazon VPC IP Address Manager (IPAM)
202205 AWS Black Belt Online Seminar Amazon VPC IP Address Manager (IPAM)
 
202205 AWS Black Belt Online Seminar Amazon FSx for OpenZFS
202205 AWS Black Belt Online Seminar Amazon FSx for OpenZFS202205 AWS Black Belt Online Seminar Amazon FSx for OpenZFS
202205 AWS Black Belt Online Seminar Amazon FSx for OpenZFS
 
202204 AWS Black Belt Online Seminar AWS IoT Device Defender
202204 AWS Black Belt Online Seminar AWS IoT Device Defender202204 AWS Black Belt Online Seminar AWS IoT Device Defender
202204 AWS Black Belt Online Seminar AWS IoT Device Defender
 
202204 AWS Black Belt Online Seminar Amazon Connect を活用したオンコール対応の実現
202204 AWS Black Belt Online Seminar Amazon Connect を活用したオンコール対応の実現202204 AWS Black Belt Online Seminar Amazon Connect を活用したオンコール対応の実現
202204 AWS Black Belt Online Seminar Amazon Connect を活用したオンコール対応の実現
 
202204 AWS Black Belt Online Seminar Amazon Connect Salesforce連携(第1回 CTI Adap...
202204 AWS Black Belt Online Seminar Amazon Connect Salesforce連携(第1回 CTI Adap...202204 AWS Black Belt Online Seminar Amazon Connect Salesforce連携(第1回 CTI Adap...
202204 AWS Black Belt Online Seminar Amazon Connect Salesforce連携(第1回 CTI Adap...
 
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
 
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと
 
202202 AWS Black Belt Online Seminar AWS Managed Rules for AWS WAF の活用
202202 AWS Black Belt Online Seminar AWS Managed Rules for AWS WAF の活用202202 AWS Black Belt Online Seminar AWS Managed Rules for AWS WAF の活用
202202 AWS Black Belt Online Seminar AWS Managed Rules for AWS WAF の活用
 
202203 AWS Black Belt Online Seminar Amazon Connect Tasks.pdf
202203 AWS Black Belt Online Seminar Amazon Connect Tasks.pdf202203 AWS Black Belt Online Seminar Amazon Connect Tasks.pdf
202203 AWS Black Belt Online Seminar Amazon Connect Tasks.pdf
 
SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介
SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介
SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介
 
Amazon QuickSight の組み込み方法をちょっぴりDD
Amazon QuickSight の組み込み方法をちょっぴりDDAmazon QuickSight の組み込み方法をちょっぴりDD
Amazon QuickSight の組み込み方法をちょっぴりDD
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
 
パッケージソフトウェアを簡単にSaaS化!?既存の資産を使ったSaaS化手法のご紹介
パッケージソフトウェアを簡単にSaaS化!?既存の資産を使ったSaaS化手法のご紹介パッケージソフトウェアを簡単にSaaS化!?既存の資産を使ったSaaS化手法のご紹介
パッケージソフトウェアを簡単にSaaS化!?既存の資産を使ったSaaS化手法のご紹介
 
202202 AWS Black Belt Online Seminar Amazon Connect Customer Profiles
202202 AWS Black Belt Online Seminar Amazon Connect Customer Profiles202202 AWS Black Belt Online Seminar Amazon Connect Customer Profiles
202202 AWS Black Belt Online Seminar Amazon Connect Customer Profiles
 
Amazon Game Tech Night #24 KPIダッシュボードを最速で用意するために
Amazon Game Tech Night #24 KPIダッシュボードを最速で用意するためにAmazon Game Tech Night #24 KPIダッシュボードを最速で用意するために
Amazon Game Tech Night #24 KPIダッシュボードを最速で用意するために
 
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
 
202111 AWS Black Belt Online Seminar AWSで構築するSmart Mirrorのご紹介
202111 AWS Black Belt Online Seminar AWSで構築するSmart Mirrorのご紹介202111 AWS Black Belt Online Seminar AWSで構築するSmart Mirrorのご紹介
202111 AWS Black Belt Online Seminar AWSで構築するSmart Mirrorのご紹介
 
202201 AWS Black Belt Online Seminar Apache Spark Performnace Tuning for AWS ...
202201 AWS Black Belt Online Seminar Apache Spark Performnace Tuning for AWS ...202201 AWS Black Belt Online Seminar Apache Spark Performnace Tuning for AWS ...
202201 AWS Black Belt Online Seminar Apache Spark Performnace Tuning for AWS ...
 
202112 AWS Black Belt Online Seminar 店内の「今」をお届けする小売業向けリアルタイム配信基盤のレシピ
202112 AWS Black Belt Online Seminar 店内の「今」をお届けする小売業向けリアルタイム配信基盤のレシピ202112 AWS Black Belt Online Seminar 店内の「今」をお届けする小売業向けリアルタイム配信基盤のレシピ
202112 AWS Black Belt Online Seminar 店内の「今」をお届けする小売業向けリアルタイム配信基盤のレシピ
 

Recently uploaded

Recently uploaded (8)

ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
 

The Twelve-Factor Appで考えるAWSのサービス開発

  • 1. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. The Twelve-Factor App で考える AWS のサービス開発 31 October 2018 Amazon Web Services Japan Solutions Architect Fumihiko Hata ,Yuki Chiba
  • 2. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. スピーカー紹介 千葉 悠貴 アマゾン ウェブ サービス ジャパン株式会社 シニアソリューションアーキテクト 畑 史彦 アマゾン ウェブ サービス ジャパン株式会社 ソリューションアーキテクト
  • 3. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. What is The Twelve-Factor App
  • 4. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. The Twelve-Factor App 2011年にHerokuのエンジニアが提唱した、アプリ開発の方法論 • セットアップ自動化のために宣言的なフォーマットを使い、プロジェクト に新しく加わった開発者が要する時間とコストを最小化する。 • 下層のOSへの依存関係を明確化し、実行環境間での移植性を最大化する。 • モダンなクラウドプラットフォーム上へのデプロイに適しており、サー バー管理やシステム管理を不要なものにする。 • 開発環境と本番環境の差異を最小限にし、アジリティを最大化する継続的 デプロイを可能にする。 • ツール、アーキテクチャ、開発プラクティスを大幅に変更することなくス ケールアップできる。 サービスとして動くアプリを開発しているすべての開発者が対象
  • 5. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. The Twelve-Factor App I. コードベース バージョン管理される1つのコードベースと複数デプロイ II. 依存関係 依存関係を明示的に宣言し分離する III.設定 設定を環境変数に格納する IV.バックエンドサービス バックエンドサービスをアタッチされたリソースとして扱う V. ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを厳密に分離する VI.プロセス アプリを1つ又は複数のステートレスなプロセスとして実行 VII.ポートバインディング ポートバインディングを通してサービスを公開する VIII.並行性 プロセスモデルによってスケールアウトする IX. 廃棄容易性 高速な起動とグレースフル停止で堅牢性を最大化する X. 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ XI. ログ ログをイベントストリームとして扱う XII.管理プロセス 管理タスクを1回限りのプロセスとして実行する https://12factor.net/ja/
  • 6. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. What is Cloud
  • 7. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. What is Cloud • 初期投資不要 • 使った分にだけ支払い • 柔軟なリソースの選択 • 迅速なリソースの確保/解放 それによる素早い開発サイクル → システムの付加価値の向上に、より専念
  • 8. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. What is Cloud • 初期投資不要 • 使った分にだけ支払い • 柔軟なリソースの選択 • 迅速なリソースの確保/解放 それによる素早い開発サイクル → システムの付加価値の向上に、より専念 インフラストラクチャは 柔軟・迅速・高コスト効率 その上で動くアプリケーションは?
  • 9. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. What is Cloud クラウド(インフラストラクチャ)には 柔軟性や機動力やコスト効果の高い仕組みが備わっている それらを十分に活かすアプリケーション構成が クラウドの力をさらに引き出す
  • 10. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. The Twelve-Factor App アプリケーションを疎結合にするための指針・方法論 疎結合 と クラウド の相性 疎結合なアプリケーションは・・・ • デプロイ が容易 • 起動 / 停止 / 中断 が容易 • スケールアウト / スケールイン が容易
  • 11. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. The Twelve-Factor App
  • 12. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. I. コードベース バージョン管理されている1つのコードベースと 複数のデプロイ
  • 13. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. I. コードベース コードベースとアプリケーションの間には、常に1対1の関係がある。 • コードベース : アプリケーション が N : 1 → 分散システム • コードベース : アプリケーション が 1 : N → コードベースの様々なバージョンが複数のアプリケーションから参照され る状態を管理する必要 → コードをライブラリに分離 アプリケーションごとにただ1つのコードベースが存在するが、アプリ ケーションのデプロイは複数存在する。 • デプロイごとに異なるバージョンがアクティブであるかもしれないが、 コードベースはすべてのデプロイを通して同一である
  • 14. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. AWS CodeCommit Secure, scalable, managed Git source control スターンダードな Git tool が利用可能 Amazon S3 の Scalability, availability, durability をストレージに活用 Encryption at rest with customer-specific keys レポジトリサイズの上限なし Post commit hooks で SNS/Lambda を呼び出し
  • 15. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. II. 依存関係 依存関係を明示的に宣言し分離する
  • 16. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. II. 依存関係 https://12factor.net/ja/dependencies システム全体にインストールされるパッケージが暗黙的に存在することに 決して依存しない • すべての依存関係を 依存関係宣言 マニフェストで完全かつ厳密に宣言する • 実行時には 依存関係分離 ツールを使って、取り囲んでいるシステムから暗黙 の依存関係が“漏れ出ない”ことを保証する • 依存関係の指定は、本番環境と開発環境の両方に適用する いかなるシステムツールの暗黙的な存在にも依存しない • アプリ外のツールに依存しない(OSにプリインストールされているcurlなど) • 将来に渡ってそのツールが環境に存在するか、互換性のあるバージョンが提供 され続けるかはわからない • アプリケーションに必要な機能はアプリケーション内で実装する
  • 17. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 依存関係宣言マニフェストと依存関係分離ツール 言語 分離ツール 宣言マニフェスト Node.js npm package.json Ruby bundler gemfile Python pip requirements.txt Java mvn package pom.xml C# NuGet .nuspec Go dep manifest.json SAM sam package template.yml Docker docker build Dockerfile Ansible ansible-playbook playbook Infrastructure as Codeでも同様
  • 18. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. SAM (Serverless Application Model) • サーバレスアプリに最適化したAWS CloudFormationの拡張 • サーバレスアプリ用の新たなリソースタイプ • 関数 (Lambda Function) • API (API Gateway) • テーブル (DynamoDB) • CloudFormationがサポートしているすべてのものをサポート • 既存のファンクションをSAMテンプレートとしてエクスポート可能 • オープンな仕様(Apache 2.0) http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-ct-example-use-app-spec.html
  • 19. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. SAM − デプロイの流れ Step1 : SAMの表記方法でCloudFormation テンプレートを作成する Step2 : cloudformation packageコマンドで パッケージ化しS3バケットに格納する Step3 : cloudformation deployコマンドで パッケージをデプロイする AWSTemplateFormatVersion: '2010-09-09’ Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Handler: handler Runtime: runtime CodeUri: s3://bucketName/codepackage.zip aws cloudformation package ¥ --template-file /path_to_template/template.yaml ¥ --s3-bucket bucket-name ¥ --output-template-file packaged-template.yaml aws cloudformation deploy ¥ --template-file /path_to_template/packaged-template.yaml ¥ --stack-name my-new-stack ¥ --capabilities CAPABILITY_IAM
  • 20. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. III. 設定 設定を環境変数に格納する
  • 21. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. III. 設定 アプリケーションの 「設定」 は、デプロイ(ステージング、本番、開発 環境など)の間で異なり得る唯一のもの。 • 設定をコードから厳密に分離すること • この“設定”の定義には、アプリケーション内部の設定は 含まない • 認証情報を漏洩させることなく、コードベースを今すぐにでもオープンソース にすることができるか 設定を 「環境変数」 に格納する。 • 環境変数は、コードを変更することなくデプロイごとに簡単に変更できる • 環境変数は、独自形式の設定ファイルやJava System Propertiesなど他の設定 の仕組みとは異なり、環境変数は言語やOSに依存しない標準 • 環境変数は粒度の細かい管理であり、それぞれの環境変数は互いに直交
  • 22. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. AWS Systems Manager Run Command Maintenance Window Inventory State Manager Parameter Store Patch Manager Automation デプロイ、構成 および管理 トラッキングと アップデート 共有コンポーネント分類と可視化 Resource Groups Insights Dashboard
  • 23. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Parameter Store • 設定データ管理と機密管理のための安全な階層型ストレージ • パスワード、データベース文字列、ライセンスコードなどのデー タをパラメータ値として保存可能 • プレーンテキストまたは暗号化されたデータとして保存可能 • 作成時に指定した一意の名前を使用して値を参照 • Run Command, Automation, State Managerなどから参照可能 • 例:Run Commandから参照する場合 aws ssm send-command --instance-ids i-1a2b3c4d5e6f7g8 ¥ --document-name AWS-RunPowerShellScript ¥ --parameter '{"commands":["echo {{ssm:param}}"]}'
  • 24. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 環境変数 • AWS Lambda 環境変数 • コンテナのプロセスに Parameter Storeから 環境変数を経由して 「設定」を注入する例 dockerfile ENTRYPOINT ["./entrypoint.sh"] entrypoint.sh export DB_HOST=$(aws ssm get-parameters ¥ --name /database/sample/host ¥ --query "Parameters[0].Value")
  • 25. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. データベースへの認証情報や API キーなど シークレットのライフサイクル管理 AWS Secrets Manager
  • 26. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. IV. バックエンドサービス バックエンドサービスをアタッチされた リソースとして扱う
  • 27. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. IV. バックエンドサービス https://12factor.net/ja/backing-services バックエンドサービスとはアプリケーションが通常の動作の中でネット ワーク越しに利用するすべてのサービス • DB、キャッシュ、NWストレージ、キュー、監視サービスなど • 外部のAPIサービス(Twitter API、 Github APIなど) ローカルサービスとサードパーティサービスを区別しない • すべてのバックエンドサービスを設定に格納されたURLでアクセス可能にする • アプリケーションのコードに変更を加えることなく、ローカルのMySQLをサー ドパーティサービス(RDSなど)に切り替えることができるべき リソースは自由にアタッチしたり、デタッチしたりできるように • DBに問題が起きた場合、既存のDBをデタッチし、バックアップから復元した DBをアタッチできるようにする
  • 28. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 主なAWSのアプリバックエンドサービス Amazon S3 99.999999999%の耐久性を持つ 容量無制限のオブジェクトストレージ Amazon RDS DB管理の運用負荷を軽減する リレーショナルデータベース Amazon DynamoDB データ容量無制限、最大スループット 無制限のNoSQL Amazon ElastiCache Memcached, Redisを管理する インメモリキャッシュ Amazon SQS 信頼が高くスケーラブルな メッセージキューサービス Amazon SNS publish-subscribe(pub-sub)型の メッセージングサービス Amazon Kinesis ストリームデータ/動画をリアルタ イムで容易に収集、処理、分析 Amazon CloudWatch メトリクスやログの収集、可視化、 監視、検知機能を提供
  • 29. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. バックエンドサービスを使う上での注意点 バックエンドサービスの遅延、停止の可能性を考慮する • 代表的なアーキテクチャパターン • リトライ:一時的な中断を考慮し、バックエンドへのリクエストはリトライする • タイムアウト:長期サービス断を止めるため、リトライタイムアウトを設ける • サーキットブレイカー:タイムアウトが頻発する場合、リクエスト自体を止める ※最近はアプリではなくサービスメッシュ層で吸収することも多い • AWSサービスをバックエンドサービスに使う場合は、各サービスの Rate Limitを考慮 • Rate Limitを超えるとスロットリングされる • Rate Limitを把握し、必要に応じて上限緩和申請をおこなう • 上限緩和ができない場合、キャッシング、キューイング、シャーディングなどの デザインパターンを導入しバックエンドの負荷を緩和する https://docs.aws.amazon.com/ja_jp/general/latest/gr/ aws_service_limits.html
  • 30. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Exponential Backoff And Jitter クライアント数が増えるとスロットリング時に多くのクライアントリソースを無駄にする 「1回めはN個のクライアントが競合を起こし1つだけが成功する、次はN-1個のクライアントが競合、更に次はN-2個の・・・」 →リトライに遅延(Backoff)とゆらぎ(Jitter)を導入する https://aws.typepad.com/sajp/2015/03/backoff.html Exponential Backoffの導入効果 Backoffを導入しない場 合クライアント数の2乗 に比例したリクエストが 発生する Backoffを導入すると リクエスト数は若干 改善する スロットリングにあった 全クライアントが同じ タイミングでリトライしている Jitterを加えたことで 無駄なリクエスト数 が減っている リトライタイミングが散らばり、 競合状態の収束が早まる Jitterの導入効果 遅延はExponential(指数的)に 徐々に長くしている
  • 31. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. AWS SDKでのリトライ実装例 https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk- core/src/main/java/com/amazonaws/retry/PredefinedBackoffStrategies.java aws-sdk-java/aws-java-sdk-core/src/main/java/com/amazonaws/retry/PredefinedBackoffStrategies.java Exponential Backoffの実装 jitterの実装
  • 32. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. V. ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを 厳密に分離する
  • 33. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. V. ビルド、リリース、実行 コードベースは3つのステージを経て、(開発環境ではない)デプロイへ と変換される 1. ビルド:コードリポジトリを実行可能な塊へと変える変換 2. リリース:上記の成果物を受け取り、それをデプロイの現在の「設定」と結合 3. 実行(ランタイム):選択されたリリースに対して、アプリケーションのいく つかのプロセスを起動する ビルド、リリース、実行の3つのステージを厳密に分離する。 • 一度作られたリリースは変更することはできない • ビルドステージは開発者によって駆動されるが、 実行ステージは自動で開始されうる • 実行ステージはできるだけ可変部分を持たないようにするべき
  • 34. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. AWS Code Services AWS CodeCommit • セキュア、スケーラブルなGit互換のリポジトリサービス • スタンダードなGit Toolからアクセス可能 • PushなどのイベントをトリガーにSNS/Lambdaを呼び出し可能 AWS CodeBuild • スケーラビリティに優れたビルドサービス • ソースのコンパイル、テスト、パッケージ生成をサポート • Dockerイメージの作成も可能 AWS CodeDeploy • S3またはGitHub上のコードをあらゆるインスタンスにデプロイ • デプロイを安全に実行するための様々な機能を提供 • In-place(ローリング) およびBlue/Greenのデプロイをサポート AWS CodePipeline • リリースプロセスのモデル化と見える化を実現 • カスタムアクションによる柔軟なパイプライン作成が可能 • 様々なAWSサービスや3rdパーティ製品との統合をサポート
  • 35. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VI. プロセス アプリケーションを1つもしくは複数の ステートレスなプロセスとして実行する
  • 36. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VI. プロセス https://12factor.net/ja/processes アプリプロセスはステートレスかつシェアードナッシングに • 永続化する必要のあるすべてのデータは、ステートフルなバックエンドサービ スに格納する(DB、キャッシュエンジンなど) プロセスのメモリ空間やファイルシステムは、短い単一のトランザクショ ン内でのキャッシュとして利用してもOK • メモリやディスクにキャッシュされたものが将来のリクエストやジョブにおい て利用できることは保証されない • プロセスが再起動するとメモリやtmpファイルは消えうる スティッキーセッションは利用しない • セッションはバックエンドサービスに格納する(redis、memcacheなど)
  • 37. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. ステートレス/シェアードナッシングアーキテクチャ データストアはバックエンドサービスに • 構造化データ:RDS • キャッシュ、セッション情報:ElastiCache • KVS:DynamoDB • ファイルオブジェクト:S3 ELBのスティッキーセッションは利用しない 共有データストアを作らない • 極力複数プロセスから共有のNFSマウントなどはしない • 共有するリソースはバックエンドサービスとして独立 してスケーラビリティを担保できることを確認する Web/AP RDS ElastiCache (Redis) S3(コンテンツ配信) S3(log)
  • 38. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VII. ポートバインディング ポートバインディングを通してサービスを公開する
  • 39. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VII. ポートバインディング Webアプリケーションは ポートにバインドすることでHTTPをサービス として公開し、 そのポートにリクエストが来るのを待つ。 • コンテナが実行環境にWebサーバーランタイムを注入することを頼りにしない • リクエストを処理するための実行環境との契約は、ポートをバインドすること である ポートバインディングの方法によって、あるアプリケーションが他のアプ リケーションにとってのバックエンドサービスになれる。 • ポートバインディングによって公開されるサービスはHTTPだけではない • ほぼすべてのサーバーソフトウェアは、ポートをバインドするプロセスを用い て動作し、リクエストが来るのを待つ
  • 40. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VII. ポートバインディング コンポーネント間のやり取りをポートバインディングで分離 → 通信が TCP/UDP のレベルで分離される (例えば、Shared Memory 使ったプロセス間通信では コンポーネント間がより密結合になってしまう) あるアプリケーションが他のアプリケーションにとっての バックエンドサービスになることができる
  • 41. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VII. ポートバインディング Elastic Load Balancing client Port Binding Port Binding 例)共有メモリ プロセス間通信 Port Binding
  • 42. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VIII. 並行性 プロセスモデルによってスケールアウトする
  • 43. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. VIII. 並行性 https://12factor.net/ja/concurrency アプリケーションはプロセス単位でスケールさせる • 1プロセスをマルチスレッドにすることでスケールを担保するのではなく、プ ロセス単位でスケールアウトする • マルチスレッドアプリケーションを禁止しているわけではない アプリケーションは垂直方向ではなく水平方向でスケールさせる • シェアードナッシングで水平分割可能なTwelve-Factor Appプロセスの性質は、 スケールアウトが容易 アプリプロセスはデーモン化しない、PIDファイルを書き出さない • プロセスの管理(出力ストリーム、プロセスクラッシュの対応、ユーザーによる 再起動への対応)はOSのプロセスマネージャー(systemdなど)に任せる
  • 44. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 水平スケーリングへの対応 アプリケーションインスタンス/コンテナは原則AutoScaling • サイズ維持 : Auto Healingの用途 • 手動スケーリング:必要なときにサイズを手動で変更 • 動的スケーリング:負荷などのメトリクスをベースにスケーリング • スケジュールベース:定義したスケジュールに基づいてスケーリング 平常時は負荷傾向が予測できる ⇩ スケジュールベース 予定された大量負荷への対策 ⇩ +手動スケーリング 緩やかな負荷変動の対策 ⇩ +動的スケーリング
  • 45. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. スケールアウトへの対応 • BootStrap処理、ヘルスチェックパスの実装 • クールダウン期間の考慮 • スパイクトラフィックはAuto Scalingでは救いきれない点は注意 スケールインへの対応 • ログの待避、グレースフルシャットダウンを考慮 • どうしてもすぐに落とせないリソースはライフサイクルフックを実装 水平スケーリングへの対応
  • 46. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. IX. 廃棄容易性 高速な起動とグレースフルシャットダウンで 堅牢性を最大化する
  • 47. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. IX. 廃棄容易性 プロセス は 廃棄容易 である、すなわち即座に起動・終了することがで きる。 • プロセスは、 起動時間を最小化する よう努力するべきである • 素早く柔軟なスケールと、コード や 設定 に対する変更の素早いデプロイを容 易にし、本番デプロイの堅牢性を高める SIGTERMシグナルを受け取ったときに、グレースフルにシャットダウ ンする。 • Webプロセスの場合、グレースフルシャットダウンは、サービスポートのリッ スンを中止し処理中のリクエストが終了するまで待ち、シャットダウンするこ とで実現される • ワーカープロセスの場合、グレースフルシャットダウンは、処理中のジョブを ワーカーキューに戻すことで実現される
  • 48. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. IX. 廃棄容易性 • たいていのWebアプリケーションフレームワークや Webサーバはきちんと対応されているので気にする必要 がない? • 例えば、バッチのアプリケーションは、長い実行時間の 途中で速やかに安全に中止や中断をハンドリングできる 設計になっていますか? • キューイング、ワークフローの活用 • Amazon SQS, AWS StepFunctionsなど
  • 49. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Spot Instance • オンデマンド • スタンダードな時間課金型インスタンス • リザーブドインスタンス • 1年間または3年間の利用予約をすることで25〜70%前後の割引 • スポットインスタンス • 使われていないEC2インスタンスに入札して格安利用 • 最大90%程度の大幅コストカットが可能 • Dedicated Host • お客様専用の物理サーバを確保
  • 50. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Spot Instance • 使われていないEC2インスタンスに入札して格安利用 ただし、スポット価格高騰あるいはスポットインスタンス 枯渇による強制ターミネートがありうる コスト削減 計算結果をより 速く 簡単に利用 柔軟なリソース
  • 51. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. X. 開発/本番一致 開発、ステージング、本番環境をできるだけ 一致させた状態を保つ
  • 52. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. X. 開発/本番一致 https://12factor.net/ja/dev-prod-parity 継続的デプロイしやすいよう開発環境と本番環境のギャップを小さく保つ • 時間のギャップ: 開発者が編集したコードが本番に反映されるまでを短く • 人材のギャップ:コードを書いた開発者はそのコードのデプロイに関わる • ツールのギャップ: 開発環境と本番環境でできるだけ同じツールを使う バックエンドサービスも開発/本番をできるだけ一致させる • 開発環境ではSQLiteを使い、本番ではPostgreSQLを使うなどをしない • バックエンドサービスの違いは、開発環境では動作するアプリが本番環境で動 かいない、という状況を招く
  • 53. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 開発環境と本番環境のギャップを小さく 時間のギャップ • CI/CDパイプラインを導入し継続的にインテグレーション/デプロイする 人材のギャップ • CI/CDパイプラインでコード開発者が自分でデプロイする • コードのコミットとデプロイの権限をわける必要がある場合、Dockerイ メージ、AMI、CloudFormationテンプレートなど同一性が担保できるコ ンポーネントを分界点として受け渡す ツールのギャップ • 開発環境とのポータビリティ→Dockerが得意とするところ • 開発環境でモックとして動くAWSサービス: DynamoDBローカル、SAMローカル、LocalStack
  • 54. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. XI. ログ ログをイベントストリームとして扱う
  • 55. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. ログ ログは、すべての実行中のプロセスとバックエンドサービスの出力スト リームから収集されたイベントが、集約されて時刻順に並べられたスト リームである。 • ログは一般的にディスク上のファイルに書き込まれる • しかしこれは出力フォーマットの一つに過ぎない • ログには固定の始まりと終わりはなく、アプリケーションが稼動している限り 流れ続ける アプリケーションの出力ストリームの送り先やストレージについて一切関 知しない。 • アプリケーションのイベントストリームは、ファイルに送られたり、ターミナ ルでtailを使ってリアルタイムに見られたりする
  • 56. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Amazon ECS Logging Driver • Amazon ECS がサポートしている Docker の Logging Driver • json-file, syslog, journald, gelf, fluentd, awslogs, • awslogs • Amazon CloudWatch Logs にログを送信 • Amazon CloudWatch Logs から他サービスへ容易に連携 • fluentd • fluentd の in_forward にログを送信 • OSS の豊富なプラグインを使って多くのデータストアや サービスへログを転送可能
  • 57. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. ログを awslogs 経由で収集・分配 Amazon CloudWatch Logs Amazon CloudWatch Logs Amazon CloudWatch Logs Amazon CloudWatch Logs Amazon S3 Amazon Kinesis AWS Lambda Amazon Elasticsearch Service Amazon ECS 保存 ストリーム 処理 検索
  • 58. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. XII. 管理プロセス 管理タスクを1回限りのプロセスとして実行する
  • 59. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. XII. 管理プロセス https://12factor.net/ja/admin-processes 管理プロセス=アプリのための1回限りの管理・メンテナンス用のタスク • データベースのマイグレーション(rake db:migrateなど) • 特定の修正のための一回限りのスクリプト(DBの特定レコードの修正など) 管理タスクは1回限りのプロセスとして、長時間実行されるプロセスと全 く同じ環境で実行する • 管理プロセスは、あるリリースに対して実行され、そのリリースに対して実行 されるすべてのプロセスと同じコードベースと設定を使う • 管理用のコードは、アプリケーションコードと一緒にデプロイする • アプリと同じ依存関係分離ツールを使う • RubyのWebプロセスが`bundle exec thin start`を使うのであれば、DBマイグレーションには `bundle exec rake db:migrate`を使う、など
  • 60. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 管理タスクは1回限りのプロセスとして実行する 悪い例 良い例 db:migrateを手動で実行 db:migrateを実行するためのスクリプトを作成 しデプロイパイプラインに含める ecs:UpdateService時にアプリ起動スクリプト 内でdb:migrateを実行し、同じスクリプトの中 でRails サーバーを起動 db:migrateを実行するタスクをecs:RunTask それが成功したら別のデプロイステージに進み、 ecs:UpdateServiceでRailsサーバーコンテナを アップデート
  • 61. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Wrap up
  • 62. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Twelve-Factor I. コードベース バージョン管理される1つのコードベースと複数デプロイ II. 依存関係 依存関係を明示的に宣言し分離する III.設定 設定を環境変数に格納する IV.バックエンドサービス バックエンドサービスをアタッチされたリソースとして扱う V. ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを厳密に分離する VI.プロセス アプリを1つ又は複数のステートレスなプロセスとして実行 VII.ポートバインディング ポートバインディングを通してサービスを公開する VIII.並行性 プロセスモデルによってスケールアウトする IX. 廃棄容易性 高速な起動とグレースフル停止で堅牢性を最大化する X. 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ XI. ログ ログをイベントストリームとして扱う XII.管理プロセス 管理タスクを1回限りのプロセスとして実行する https://12factor.net/ja/
  • 63. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. The Twelve-Factor App アプリケーションを疎結合にするための指針・方法論 疎結合 と クラウド の相性 疎結合なアプリケーションは・・・ • デプロイ が容易 • 起動 / 停止 / 中断 が容易 • スケールアウト / スケールイン が容易
  • 64. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. The Twelve-Factor App アプリケーションを疎結合にするための指針・方法論 疎結合 と クラウド の相性 疎結合なアプリケーションは・・・ クラウドの力を最大限に引き出す
  • 65. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Appendix
  • 66. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. 合わせて読みたい Architecting for the Cloud (2010)  Decouple your components コンポーネントを疎結合にする  Design for failure 障害に備えた設計する  Implement elasticity 伸縮自在性を実装する  Think parallel 並列化する https://s3.amazonaws.com/awsmedia/jp/wp/AWS_WP_Cloud_ BestPractices_JP_v20110531.pdf
  • 67. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
  • 68. © 2018, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Thank You!