はじめに
JAWS Summit Tokyo 2019の3日目に参加してきました。 今年もコンテナとサーバレスを中心に聞いてきたため、レポートをまとめます。
登壇者
AWS ソリューションアーキテクト 原 康紘氏
コンテナとは
- アプリケーションを構成するコンポーネント
- 以下、4つの要素が必要
- アプリケーションコード
- ランタイム/エンジン
- 依存ライブラリ/パッケージ
- 設定
- 依存ライブラリ/パッケージ
- ランタイム/エンジン
- アプリケーションコード
- ローカル、Staging、本番で環境の差異が出ることがある
- JVMのバージョンが全部違う、など
- 結果、ローカルで動いていたものが本番で動かない!!
- JVMのバージョンが全部違う、など
- 解決策としてのコンテナ
- アプリが依存するものを全てコンテナに入れる
- ランタイム
- 依存ライブラリ
- アプリケーションコード
- 設定はない。
- 設定を入れると、開発環境用のコンテナ、ステージグング用コンテナ、、、など解決にならない。
- アプリが依存するものを全てコンテナに入れる
- Docker
- コンテナのデファクト
- すべての環境で同じコンテナを動かす
仮想マシンとコンテナ
- すごく似てる
- ec2
- AMIを指定して起動
- コンテナ
- コンテナイメージを指定して起動
- 軽量な仮想マシンと思いこんでしまうことがある。実際は違う。
- ec2
- 違う点
- VMはマシン。コンテナはただのプロセス。
- プロセスだから起動が早い
- 1コンテナ1プロセスにするのがベストプラクティス
- VM
- Hypervisor
- Guest OS
- Bins/Libs
- App
- コンテナ
- Hypervisor
- Guest OS
- Docker Engine
- Bins/Libs
- App
- VMはマシン。コンテナはただのプロセス。
Dockerを利用した基本ワークフロー
- その1(Production)
Dockerfile
作成$ docker build
- コンテナイメージs区政
- その2
$ docker run
- コンテナ内作業
$ docker cmmit
コンテナ実行
$ docker pull
$ docker run
思っていたよりも手作業!?
- dockerの責務は同一サーバ上のコンテナライフサイクル管理
- 複数サーバやコンテナを束ねた管理 は責務外
- これをやるなら、オーケストレーションツールが必要
- 手作業のコンテナイメージダウンロードと実行は非効率かつミスを招く。。。
コンテナオーケストレーション
- ECS
- クラスタでコンテナ実行
- クラウドでコンテナを本番環境利用するためのオーケストレータ
- 2014年当時、そういうサービスはなかった
- AWSサービスとの高度な連携
- 数億コンテナ/週、数百万EC2インスタンスを管理する
- シンプル
- 2つ学べばOK
- タスク
- サービス
- 2つ学べばOK
- Linux、Windowsコンテナサポート
- Kubernetes
- 運用難易度が高いツール
- AWSで運用・管理してくれないか?という相談が増えてきた
- AWS + K8s=EKS
- 世界の51%のK8sユーザがAWS上でワークロードを動かしてる(CNCFより)
- コントロールプレーンを提供
- 脳みそのような存在
- 難易度が高いK8sをマネージドで提供
- エコシステムのOSSやツールを利用できる
- CNCF certified
- AWSはK8sには全く手を入れていない
- CNCF certified
- 各種AWSをサービスとの連携
- EKSチームによるK8sコミュニティへの貢献
- OSS
- 問題が起きたときに自分で調査できる
- Pod,Deployment,Service,Jobなどのリソースに代表される高い表現力
- 運用難易度が高いツール
イメジレジストリ、コンテナ実行環境
- ECR(Elastic Container Registry)
- フルマネージドなPrivateコンテナイメージレジストリ
- イメージ置き場
- DockerHubのプライベート版みたいなイメージ
- 東京Regionにあるのでレイテンシが少ない
- IAM連携
- DockerCLIからの利用OK
- ECS/EKS/K8s以外からでも利用可能
- ローカル端末からでもOK
- フルマネージドなPrivateコンテナイメージレジストリ
- AWS Fargate
- 実行環境の環境の管理の自動化
- パッチ当てもAWSがやる
- コンテナのことだけ考えればOK
- ECS+ECR+Fargateの構成
- 仮想マシンなしでコンテナが起動できる
- 仮想マシンの管理がないためスケールアウトできる
- ECS+ECR+Fargateの構成
その他のコンテナ関連サービス
- Cloud Map
- 全てのクラウドリソースのためのサービスディスカバリ
- 名前解決
- LambdaではDNSの名前解決はできない(ARNでアクセスする)
- こういうものも名前解決できるようになる
- LambdaではDNSの名前解決はできない(ARNでアクセスする)
- 名前解決
- 全てのクラウドリソースのためのサービスディスカバリ
- App Mesh
- アプリケーションレベルのネットワーク
- アプリケーションレベルのVPCみたいなもの
- アプリケーションレベルのネットワーク
- CloudWatch Container Insights
- コンテナワークロードのためのモニタリング
現実世界のコンテナワークロード
- コンテナだけ使ってもサービスは作れない
- コンテナはやろうと思えば何でもできる
- Lambdaは運用コストが低いかわりに、できることが限られる
- コンテナはその中間
- VMは運用コストが高いかわりに、なんでもできる
セッションのまとめ
- オーケストレーション
- ECS
- EKS
- イメージレジストリ(イメージの格納)
- ECR
- ホスティング(実行環境)
- EC2
- Fargate
- アプリレベル
- App Mesh
- Cloud
まとめ
非常にわかりやすいセッションで勉強になりました。DockerとVMの違いや、Dockerとオーケストレーションの責務の話は、全て混同して考えがちな所なので、有難かったです。
自分のプロダクトをコンテナ化することが目標なので、まずはローカル環境でDockerを使い、AWSにデプロイする際にECSとECRを使ってみたいと思います!!