2019.07.01
2019年6月12日/13日/14日に幕張メッセで開催されたAWS Summit Tokyo 2019の人気セッションの内容の再演イベントがAWS Loft Tokyoで今日7月1日から5日間連続で行われる。
本日はその初日である「サーバーレス&コンテナ」回に参加。
オープニングはLoftマーケティングマネージャーのゆっきーさん。
REST APIならAPI Gateway
開発環境
マイクロサービス化して疎結合にしていくとリソースがどんどん増えていく
CloudFormationの拡張
SAMのテンプレート
AWS::Serverless::Function
をタイプに指定するとLambda関数が構築できるProperties
に Event
セクションを指定するとAPI Gatewayを構築することができるAWS::Serverless::SimpleTable
をタイプに指定するとDynamoDBテーブルが構築できるSAM CLI
$ sam init
コマンドも提供されていて、雛形をすぐ作れる$ sam local generate-event s3 --bucket hogebucket --key hogekey > s3event.json
$ sam local invoke hogeFunction -e s3event.json
$ sam local start-api
複数環境の必要性
アカウント戦略
同じアカウントでスタックを分ける
アカウントを分ける
環境変数:それぞれの環境に固有の変数を利用する
process.env
、Pythonの os.environ
のような標準的な環境変数から利用できる$ context
オブジェクトで利用できるSAM
AWS Codeサービスと組み合わせてCI/CD
X-Rayを使ってモニタリングまで対応できる
CI/CDパイプラインの構成例
CodeStar
AWS CodeDeploy
DeploymentPreference
> Type
に Canary10Percent10Minutes
等の用意された値をセットすることで段階的にデプロイできるPreTraffic
や PostTraffic
を使うと、あるタイミングでLambda関数を実行できるAPI Gatewayのカナリアリリース
AWS Serverless Application Repository
AWS CodePipeline SAR Auto-Publishというawslabsのツール
CloudWatchメトリックス
AWS X-Ray
動的Webアプリ/モバイルバックエンド
インタラクティブモバイル/モバイルオフライン処理
画像処理/シンプルなデータ加工
アプリケーション/フロー処理
流入データの連続処理
データ変更トリガー(変更に起因する処理の実行)
機械学習/ETL/データパイプライン
データレイクからのデータ加工
代表的な実装:Docker
Dockerコンテナの3フェーズ
apline
イメージレジストリにコンテナイメージをアップロードする
$ git push
と同じような操作Dockerエンジンが起動しているコンテナホストで $ docer run
コマンドを実行
コンテナのユースケース
コンテナ実行時の課題
Cloud Native Computing Foudationが開発プロジェクトをホスト
人気の理由
主要機能
データプレーン
Kubernetesオブジェクト
マニフェストと宣言的設定
Kubernetesコントロールプレーンの運用は重労働
Kubernetesリリースを改変なく利用
Kubernetesの運用を支援する機能
選択可能なデータプレーン(ノード)
オープンソースツール
必要なコマンドをインストール
eksctlコマンドで作成実行
$ eksctl create cluster -f 設定ファイル
デプロイした後は慣れ親しんだkubectlコマンドで操作することができる
$ kubectl get pods
HTTP/HTTPS対応のロードバランサーを使いたい
その他マネージドサービスと連携
ログを集約したい
オートスケールしたい
デプロイを効率化したい
Amazon ECR
データベース
関係者間調整のオーバーヘッド
非効率なスケーリング
変更による影響範囲の局所化
モジュール境界の維持しやすさ
独立したデプロイとスケーリング
自律的なチームによる開発・運用
Polyglot(-able)
AWS X-Ray
サービスの適切な分割
テストの難しさ
影響範囲を自サービス内に収める難しさ
サービス間通信の信頼性 - Reliability
呼び出し先サービスの位置は一定ではない
一時的な呼び出しの失敗
継続した呼び出しの失敗
呼び出しサービスのパフォーマンス悪化
呼び出し元システムの不具合
システムを観測できる実装の必要性
現実的...?
課題が...
OSSプロジェクト
CNCFメンテナンス
サービスメッシュとアプリケーションの密結合
Envoy proxyの動的設定変更を可能にする
App Meshはサービスメッシュのコントロールプレーン
アプリケーションレベルのネットワーク
クラスタやサービスにまたがるメッシュの構築
マネージドコントロールプレーン
トラフィックコントロール
Observability
サービスメッシュはそもそもコンテナだけのものではない
AWS App Meshパブリックロードマップ
その他
サービスメッシュ
AWS App Mesh
そもそもサービスメッシュは必要か?
動的なサービスメッシュが必要か
2019年に入ってからAppSyncやCognitoやDynamoDBを使ったサーバーレスアプリケーションを構築していてそのあたりは多少知見があったものの、そのフレームワークであるAWS SAMについては初めて知ることが大半だった。
AWSでのバックエンドの構築にはAmplify CLIやAWS CDKをよく使っていて、AWS SAMは軽く触る程度しか使ったことがなかったので、これを機会にもう少し深掘りして調査してみたい。
AWS CDKでの現状のLambda関数の開発は、
$ webpack -w
でビルド$ cdk deploy
でデプロイという流れで行なっており、ビルドとデプロイに若干時間がかかっていてなんとかしたいところ。(改善策としてTypeScriptを諦めつつ関数本体はCloud9で開発してみたり...)
AWS SAMを使うことでこれがスムーズになるなら、LambdaはSAMで、それ以外のリソースはCDKでという組み合わせ方もできるかもしれない。
Ruby on Railsでモバイルアプリのバックエンドを構築していたとき、依存関係の管理の簡略化やデプロイのワークフローの整備のためにコンテナ化を考えたことがあった。
そのときのデプロイ先はホストマシンを意識せずにコンテナを走らせることができるAWS Fargateだった。
Kubernetesという単語は耳することは多かったが、なんのために使うのか、どのような経緯でECSとEKSがあるかなどが全然わかっていなかった。
今回のセッションのおかげでコンテナの基本からKubernetesの基本、EKSでできることが一通り理解できたので、技術選定のタイミングで漁る引き出しの一つとして持っておけたらと思う。
「マイクロサービス」「サービスメッシュ」「えんゔぉい」という単語をTwitterのタイムラインやAWS Summitの会場で見聞きすることがあったが、こちらもEKS/Kubernetes同様全然概要を知らなかった。
知らなかったし、「大規模なプロジェクトで使うから当分関係なさそう」と考えていたのが正直なところ。
今回、マイクロサービスとは何かという基本の話から、マイクロサービスを考える上で発生する課題、そしてその解決策の選択肢とさらった上で一つの確立された解決策である「システムの観測性を確保するための仕組みのプロキシへのオフロード」という今回のメイントピックまで聞くことができた。
一通り聞いて理解した上でも、やっぱりまだ当分使う機会はないんじゃないかという感想は変わらなかったが、システムの規模が大きくなってくるとどのような課題が発生するのか、それにどうエンジニアたちが立ち向かっていったのかを知ることができてこちらも今後の引き出しの一つにできたと思う。
何よりトリさんの話しがうますぎて、マイクロサービス・サービスメッシュど素人の僕でも引き込まれました...!
19:00スタートで休憩なしで21:15までの2時間15分のセミナーだったが、非常に濃い内容でとても充実感があった。
知らないことだらけだったのでまずはひたすらメモ。
メモの行数を数えたら500行を超えていた。
興味ある分野で、最高のスピーカーが話してくれて、PCを使って全力でメモしてという理想的な学び方ができたが、例えばこれを一日に4セットやるとなると体が持たない気がする。
大学をイメージすると90分が一日4コマくらいが最大でしかもそれが週5日。
学んだことを持ち帰って、自分で考えて復習して、さらに次回の予習までして...となるととても回らないんじゃないだろうか。
社会に出てようやく「本当の学び方」ができていると実感する機会が日常的に得られるようになった分、大学までの学びをもっと良くしたいなぁと思うことも増えた。
こんな風に学びを楽しめる人を増やしたい。
今日でまだre:Cap 1日目。まだまだre:Capは始まったばかりなので全力でインプット&アウトプットしよう。