Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWSのコンテナウォークスルー

 AWSのコンテナウォークスルー

fun-tech meetup #11 コンテナ/クラウド シリーズ 第2回 ~クラウド編その1~

AWSのコンテナサービスに触れていない方を対象に、「ECS/ECR/EKS/Fargateって何?」から「使った気になりそう」なところまでをウォークスルー!

※Docker, Kubernetesの基礎には触れません

F5367e6dde42dda84768b5b145c12eef?s=128

Masataka Yoshida

June 28, 2019
Tweet

More Decks by Masataka Yoshida

Other Decks in Technology

Transcript

  1. AWS のコンテナ ウォークスルー 2019/06/28 fun-tech meetup #11 コンテナ/クラウド シリーズ 第2回

    ~クラウド編その1~ Masataka Yoshida
  2. 吉田 匡孝(Masataka Yoshida) 株式会社オープンストリーム 戦略技術推進本部 目に見えるモノを作る + 新しい技術に触れるおしごとがしたいなー >2 Web

    
 CakePHP, Spring, Vue.js… iOS/Android
 Ionic, Objective-C, Java… AWS, 
 Python…
  3. なんとなくでもいいから AWSのコンテナを 使えるようになりたい! 使った気になりたい!

  4. はなすこと • AWSのコンテナサービスについて • ECS/Fargate/EKS の使い方 >4 はなさないこと • ECRの使い方

    • プロダクションレベルでECS/EKSをどう動かすか
 コンテナのデプロイ戦略など…
  5. AWSのコンテナサービス について

  6. 何をするか理解していますか? >6 ECR ECS EKS Fargate

  7. 何をするか理解していますか? >7 Amazon Elastic Container Registry Amazon Elastic Container Service

    Amazon Elastic Container Service for Kubernetes AWS Fargate
  8. 順番に説明…… >8 Amazon Elastic Container Registry Amazon Elastic Container Service

    Amazon Elastic Container Service for Kubernetes AWS Fargate
  9. 順番に説明…… >9 Amazon Elastic Container Registry Amazon Elastic Container Service

    Amazon Elastic Container Service for Kubernetes AWS Fargate
  10. だいたいこうなっています >10 コントロールプレーン データプレーン Amazon EC2 AWS Fargate Amazon Elastic

    Container 
 Service Amazon Elastic Container 
 Service for Kubernetes Amazon Elastic Container 
 Registry
  11. だいたいこうなっています >11 コントロールプレーン データプレーン Amazon EC2 Amazon Elastic Container 


    Service Amazon Elastic Container 
 Registry コンテナイメージを 保管する コンテナを管理する コンテナを動かす AWS Fargate Amazon Elastic Container 
 Service for Kubernetes
  12. なぜEC2? ECSがコンテナを動かすCPUなどを貸してく れるわけではない! ECSなどのコントロールプレーンは
 コンテナの管理に注力 >12 Amazon EC2 Amazon Elastic

    Container 
 Service そのため、コンテナを動かす場所が必要
 EC2かFargateが使われる
  13. なぜEC2? ECSがコンテナを動かすCPUなどを貸してく れるわけではない! ECSなどのコントロールプレーンは
 コンテナの管理に注力 >13 Amazon EC2 Amazon Elastic

    Container 
 Service そのため、コンテナを動かす場所が必要
 EC2かFargateが使われる このEC2インスタンスにコンテナを置いてもらおう… ECSに頼まれたコンテナ動かしたるでー!
  14. EC2 V.S. Fargate >14 Amazon EC2 AWS Fargate 構築 EC2インスタンスを作って

    ECSに登録してから コンテナの環境を
 決めるだけ コンテナ内に 入れるか ✔ ✘ 料金 安め 高め (2019年1月に値下げ!) nginxのコンテナ 2 vCPU RAMは4GiB nginxのコンテナ 2 vCPU RAMは4GiB c5.xlargeを5台
 ECSクラスターに登録 × 10 × 10
  15. EC2 V.S. Fargate >15 Amazon EC2 AWS Fargate データプレーン の管理

    必要
 (例えばEC2インスタンスに 脆弱性が出たら自分で対処する) 不要 データプレーン の種類 豊富なEC2インスタンス
 から選択可 0.25-4 vCPU 0.5-30GB RAM 余剰リソース 出ちゃうかも… 出ない GPU/Windows コンテナ ✔ ✘
  16. EKSでFargateは使えない Q: Amazon EKS は AWS Fargate と連携していますか?
 A: いいえ。現在は

    Amazon EKS と AWS Fargate の間にはネ イティブな AWS 統合はありません。 https://aws.amazon.com/jp/eks/faqs/ >16
  17. コンテナ動かし方のまとめ >17 コントロールプレーン データプレーン Amazon EC2 Amazon Elastic Container 


    Service Amazon Elastic Container 
 Registry コンテナイメージを 保管する コンテナを管理する コンテナを動かす AWS Fargate Amazon Elastic Container 
 Service for Kubernetes
  18. ECS with EC2

  19. 流れ >19 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 3 2 1

  20. ECS with EC2の構成要素 >20 タスク定義 どのコンテナを動かすかを決める サービス タスク定義を選択して、コンテナーを どこのECSクラスターに置くか・何個置 くのかを決める

    ECSクラスタ− EC2インスタンスを登録して
 コンテナを動かす場所を作る nginxのタスクを c5.xlargeのクラスターに 10個置きたい もちろんロードバランサー付きで nginxのコンテナ 2 vCPU RAMは4GiB
  21. ECSのコンソール入りましたね? >21

  22. タスク定義の作成 >22

  23. 起動タイプ: EC2 >23

  24. タスクとコンテナ定義の設定 タスクロール コンテナ内でS3などを 操作したいときに権限 を追加する >24

  25. タスクの実行IAMロール 新しいロールの作成を選択 • ECSがECRからコンテナイメージを取得したり CloudWatchにログを残したりするための権限 • ロールにリソースが指定できるため、リソースを制限す る目的が想定される >25

  26. タスクサイズ >26

  27. タスクとコンテナ >27 余剰リソース 1タスクに複数のコンテナを入れることができる • コンテナの合計vCPU/メモリはタスクのvCPU/メモリ に収める必要がある • 1タスク単位でECSクラスターに配置される

  28. コンテナの追加 >28 イメージ Docker Hubの公 開イメージ名 or ECRに保存したイ メージのURL

  29. タスク定義の作成はおしまい >29

  30. 流れ >30 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 3 2 ✔

  31. ECSクラスターの作成 >31

  32. EC2 Linux + ネットワーキング >32

  33. クラスターの設定 >33 空のクラスターの作成 別にEC2インスタンス・VPCを作ってECSで使う場合は チェック

  34. インスタンスの設定 >34 キーペア 動作中のコンテナ内に入って作業する必要が出てきたときに 使用する
 EC2インスタンスにSSHしてdocker execするイメージ

  35. ネットワーキング >35

  36. コンテナインスタンス IAM ロール >36 新しいロールの作成を選択 • コンテナを動かすEC2インスタンスに設定するロール

  37. IAMロールのおさらい >37 タスクロール タスクの実行IAM ロール コンテナインスタン スIAMロール 対象 コンテナ ECS

    EC2インスタンス
  38. ECSクラスターの作成はおしまい >38 クラスターの表示ボタンが押せるようになるまで待つ

  39. 流れ >39 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 3 ✔ ✔

  40. サービスの作成 >40 サービスのタブが開いているのでそのまま作成ボタンをクリックする

  41. サービスの設定 >41

  42. Deployments/タスクの配置 >42

  43. ネットワーク構成 >43 何も変更せず次のステップをクリックする

  44. Auto Scaling (オプション) >44

  45. サービスの作成はおしまい >45 サービスの作成ボタンをクリックし、サービスの表示ができるまで待つ

  46. サービスの作成はおしまい >46 サービスの作成ボタンをクリックし、サービスの表示ができるまで待つ

  47. 流れ >47 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 ✔ ✔ ✔

  48. サービス内のタスク >48

  49. サービスの確認 >49 1. タスクのIDをクリックしてタスクを開く 2. EC2インスタンスのIDをクリックしてEC2インスタンスを開く

  50. サービスの確認 >50 3. 開かれたインスタンスのIPv4パブリックIPで接続してみる 4. Welcome to nginx!

  51. 流れ >51 タスク定義を作成する ECSクラスターを作成する サービスを作成する ✔ 完 ✔ ✔ ✔

  52. 止めたいときは… >52 タスクの停止は押さない • サービスを作成すると必要な数のコンテナを動かそうと する • サービスの停止でコンテナが止まっても再び動き出す

  53. ECSサービスの停止 >53 1. サービスを選択して更新 2. タスクの数を0にしてから全て次に進む

  54. ECSサービスの停止 >54 3. タスクが綺麗さっぱりになくなる

  55. 削除の流れ >55 サービスを削除する ECSクラスターを削除する タスク定義を削除する 4 完 3 2 1

  56. ECSサービスの削除 >56 1. 実行中のタスクが0になっているか確認 1つでも残っているとサービスを削除できない 2. サービスを選択して削除

  57. ECSサービスの削除 >57 Delete the service discovery service created with this

    service.に チェックを入れ “delete me” と入力して削除ボタンをクリック
  58. ECSクラスターの削除 >58

  59. クラスターの削除には時間がかかる >59 EC2インスタンスやネットワーキング(VPC)が削除される

  60. タスク定義の削除 >60 タスク定義名をクリックしてタスク定義を開く

  61. タスク定義を登録解除する >61 Revisionを選択して「登録解除」

  62. タスク定義が消えます >62

  63. お疲れ様でした

  64. ECS with Fargate

  65. 流れ >65 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 3 2 1

  66. 流れ タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 3 2 1

  67. ECS with Fargateの構成要素 >67 タスク定義 どのコンテナを動かすかを決める サービス タスク定義を選択して、コンテナーを どこのECSクラスターに置くか・何個置 くのかを決める

    ECSクラスタ− 「ネットワーキングのみ」で VPCだけ作る nginxのタスクを クラスターに 10個置きたい もちろんロードバランサー付きで nginxのコンテナ 2 vCPU RAMは4GiB
  68. タスク定義の作成 >68

  69. 起動タイプ: Fargate >69

  70. タスクとコンテナの定義の設定 >70

  71. タスクの実行IAMロール 新しいロールの作成を選択 • ECSがECRからコンテナイメージを取得したり CloudWatchにログを残したりするための権限 • ロールにリソースが指定できるため、リソースを制限す る目的が想定される >71

  72. IAMロールのおさらい >72 タスクロール タスクの実行IAMロール 対象 コンテナ ECS

  73. タスクサイズ >73

  74. コンテナの追加 >74 イメージ Docker Hubの公 開イメージ名 or ECRに保存したイ メージのURL

  75. タスク定義の作成はおしまい >75

  76. 流れ >76 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 3 2 ✔

  77. ECSクラスターの作成 >77

  78. ネットワーキングのみ >78

  79. クラスターの作成 >79

  80. ECSクラスターの作成はおしまい >80 クラスターの表示ボタンが押せるようになるまで待つ

  81. 流れ >81 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 3 ✔ ✔

  82. サービスの作成 >82 サービスのタブが開いているのでそのまま作成ボタンをクリックする

  83. サービスの設定 >83

  84. Deployments >84

  85. VPCとセキュリティグループ >85

  86. ネットワーク構成 >86 ほかは何も変更せず次のステップをクリックする

  87. Auto Scaling (オプション) >87

  88. サービスの作成はおしまい >88 サービスの作成ボタンをクリックし、サービスの表示ができるまで待つ

  89. サービスの作成はおしまい >89 サービスの作成ボタンをクリックし、サービスの表示ができるまで待つ

  90. 流れ >90 タスク定義を作成する ECSクラスターを作成する サービスを作成する 4 完 ✔ ✔ ✔

  91. タスク >91

  92. Welcome to nginx! >92 タスクIDをクリックするとPublic IPが出るので
 ブラウザで動作確認できる

  93. 流れ >93 タスク定義を作成する ECSクラスターを作成する サービスを作成する ✔ 完 ✔ ✔ ✔

  94. 止め方・削除の仕方 >94 サービスを作成しているため、同様の方法になります

  95. 削除が引っかかることがあります >95 必要に応じてCloudFormationスタックを開いて
 問題を突き止めます

  96. 削除が引っかかることがあります >96 VPCを手動で消しました

  97. EKS with EC2

  98. ちょっと とっつきにくい _:(´ཀ`」 ∠):_.

  99. 流れ >99 ワーカーノード(EC2インスタンス)を作成する 3 EKSクラスターを作成する 2 開発環境としてAWS CLI / kubectl

    を導入する 1 5 完 4 アプリケーションを起動する
  100. AWS CLIを導入する >100 pip3 install awscli --upgrade --user [default] aws_access_key_id=

    aws_secret_access_key= Pythonが使える環境で awscli をインストールする ~/.aws/credentialsを編集する [default] region=us-east-1 output=json ~/.aws/configを編集する
  101. kubectl を導入する >101 curl -o kubectl https://amazon-eks.s3-us- west-2.amazonaws.com/1.12.7/2019-03-27/bin/darwin/amd64/ kubectl chmod

    +x ./kubectl mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH AWS用のkubectlをインストールする Docker for Macなどで既にkubectlが導入されている場合は、 $PATH の最初にAWSのkubectlが読み込まれるようにする
  102. 流れ >102 ワーカーノード(EC2インスタンス)を作成する 3 EKSクラスターを作成する 2 開発環境としてAWS CLI / kubectl

    を導入する ✔ 5 完 4 アプリケーションを起動する
  103. EKSのコンソール >103

  104. クラスターを作成するには足りない >104 EKSが使う… クラスターが使う… ロール VPC サブネット セキュリティグループ

  105. EKSのロールを作成する >105 IAMのコンソールを開き、ロールを選択して新規作成する ロール VPC サブネット SG

  106. EKSを選択 >106 ロール VPC サブネット SG

  107. アクセス権限の確認 >107 タグはスキップする ロール VPC サブネット SG

  108. ロール名を設定して作成 >108 ロール VPC サブネット SG

  109. 準備したVPCを用いる >109 EKS用に準備してあるVPCをCloudFormationで展開する ロール VPC サブネット SG

  110. VPCのテンプレートを使う >110 https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-vpc- sample.yaml ロール VPC サブネット SG

  111. 展開するVPCに名前をつける >111 ロール VPC サブネット SG

  112. VPCを展開する >112 スタックオプションは何も設定せずに進める スタック作成後の出力をメモする ロール VPC サブネット SG

  113. クラスターの作成に戻る >113 先ほど作成したロールを選択する

  114. VPCなどを選択する >114

  115. その他はスキップして作成 >115 クラスターの作成に10分程かかる

  116. 流れ >116 ワーカーノード(EC2インスタンス)を作成する 3 EKSクラスターを作成する ✔ 開発環境としてAWS CLI / kubectl

    を導入する ✔ 5 完 4 アプリケーションを起動する
  117. kubectlをクラスター用に設定する >117 aws eks update-kubeconfig --name yoshida-eks-sample クラスター用の設定を取得する export KUBECONFIG=$KUBECONFIG:~/.kube/config

    設定をkubectlで使えるようにする kubectl get all 設定ができたか確認する
  118. ワーカーノード用のキーペアを作成 >118 EC2のコンソールを開き、キーペアを作成する

  119. ワーカーノードを作成する >119 https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks- nodegroup.yaml 再びCloudFormationのコンソールを開き、次のテンプレートを 読み込む

  120. ワーカーノードのパラメーター >120

  121. ワーカーノードのパラメーター >121

  122. ワーカーノードのパラメーター w Stack name: <cluster-name>-worker-nodes w ClusterName: 作成したクラスターの名前 w ClusterControlPlaneSecurityGroup:

    CloudFormationで作成したセキュリティグループ w NodeGroupName: <cluster-name>-worker-nodes w NodeAutoScalingGroupMinSize: スケーリンググループの最小数。デフォルトの1を設定 w NodeAutoScalingGroupMaxSize: スケーリンググループの最大数。デフォルトの3を設定 w NodeInstanceType: t2.small w NodeImageId: EKSワーカーノードで利用するAMIIDの指定 w US West (Oregon) (us-west-2):ami-73a6e20b w US East (N. Virginia) (us-east-1):ami-dea4d5a1 w KeyName: EC2アクセス用のキーペア名 w 作成したものを入力する w 省略するとエラーで中断するため必ず作成する w VpcId: CloudFormationで作成したVPCのID w Subnets: CloudFormationで作成したSubnet >122 【まずは触って体験】リリース直後のAmazon EKSでサンプルアプリケーションを動かしてみ た | DevelopersIO: https://dev.classmethod.jp/cloud/aws/eks-getting-started/
  123. ワーカーノード作成の開始 >123 スタック作成の確認で最後にある
 IAMリソースに関するチェックボックスにチェックを入れて
 スタックを作成する 5分程で完成するので、出力をメモする

  124. ワーカーノードの設定 >124 curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/ 1.10.3/2018-06-05/aws-auth-cm.yaml あらかじめ用意された設定ファイルを取得する apiVersion: v1 kind:

    ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes 設定ファイル内の rolearn を先程出力されたARNに置き換える
  125. 設定ファイルの適用 >125 kubectl apply -f aws-auth-cm.yaml 設定ファイルをワーカーノードに適用する $ kubectl get

    nodes --watch NAME STATUS ROLES AGE VERSION ip-192-168-115-223.ec2.internal NotReady <none> 0s v1.10.3 ip-192-168-211-91.ec2.internal NotReady <none> 1s v1.10.3 ip-192-168-173-105.ec2.internal NotReady <none> 0s v1.10.3 ip-192-168-211-91.ec2.internal Ready <none> 89s v1.10.3 ip-192-168-115-223.ec2.internal Ready <none> 89s v1.10.3 ip-192-168-173-105.ec2.internal Ready <none> 89s v1.10.3 設定が適用されたか確認する(Ctrl+Cで終了)
  126. 流れ >126 ワーカーノード(EC2インスタンス)を作成する ✔ EKSクラスターを作成する ✔ 開発環境としてAWS CLI / kubectl

    を導入する ✔ 5 完 4 アプリケーションを起動する
  127. アプリケーションの起動 >127 kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-master-controller.json kubectl apply -f

    https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-master-service.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-slave-controller.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/redis-slave-service.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/guestbook-controller.json kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/ guestbook-go/guestbook-service.json サンプルアプリケーションを登録する(6つ)
  128. 流れ >128 ワーカーノード(EC2インスタンス)を作成する ✔ EKSクラスターを作成する ✔ 開発環境としてAWS CLI / kubectl

    を導入する ✔ 5 完 ✔ アプリケーションを起動する
  129. アプリケーションの起動確認 >129 kubectl get services -o wide 外部公開されているアドレスを調べる LoadBalancerのEXTERNAL-IPに対して3000番ポートでアクセスする

  130. アプリケーションの起動確認 >130 LoadBalancerのEXTERNAL-IPに対して3000番ポートでアクセスする

  131. _人人人人人人人人人人_
 > 書き込みが出ない <
  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

  132. None
  133. 流れ >133 ワーカーノード(EC2インスタンス)を作成する ✔ EKSクラスターを作成する ✔ 開発環境としてAWS CLI / kubectl

    を導入する ✔ ✔ 完 ✔ アプリケーションを起動する
  134. 削除方法 >134 EKSクラスターを削除する 3 ワーカーノード(EC2インスタンス)を削除する 2 アプリケーションを削除する 1 4 完

  135. アプリケーションの削除 >135 kubectl delete rc/redis-master rc/redis-slave rc/ guestbook svc/redis-master svc/redis-slave

    svc/guestbook 設定ファイルをワーカーノードに適用する $ kubectl get services -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 68m <none> $ kubectl get svc --all-namespaces NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 68m kube-system kube-dns ClusterIP 10.100.0.10 <none> 53/UDP,53/TCP 68m $ kubectl delete svc kubernetes service "kubernetes" deleted 同じCLUSTER-IPのサービスを削除する
  136. ワーカーノードの削除 >136 CloudFormationで作ったワーカーノードのスタックを削除する

  137. ワーカーノードの削除 >137 EC2のコンソールでキーペアを削除する

  138. クラスターの削除 >138 EKSのコンソールに戻り、クラスターを削除する

  139. クラスターの削除 >139 CloudFormationでVPCのスタックを削除する

  140. まとめ AWSのコンテナサービスは次の2つ(+1つ)を組み合わせる • コンテナを管理するコントロールプレーン(ECS, EKS) • コンテナを動かすデータプレーン(EC2, Fargate) • コンテナイメージを保管するECR

    >140 ECSはタスク定義、クラスター、サービスの順で組み立てる EKSはクラスター、ワーカーノード、アプリケーションの順で
 組み立てる
  141. 参考 • 「それコンテナにする意味あんの?」迷える子羊に捧げるコンテナ環境徹底比較 #cmdevio2019 | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/cmdevio2019-container/ • Amazon

    ECS入門 〜公式のDockerイメージを使って10分で構築してみる〜 | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/amazon-ecs-entrance-1/ • 【まずは触って体験】リリース直後のAmazon EKSでサンプルアプリケーションを動かしてみ た | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/eks-getting-started/ • [アップデート]EKSを使う際にaws-iam-authenticatorが不要になりました! | DevelopersIO: • https://dev.classmethod.jp/cloud/aws/eks-update-get-token-cmd/ >141