Upload
amazon-web-services-japan
View
234
Download
3
Embed Size (px)
Citation preview
Amazon EC2 Container Service (ECS)によるWindowsコンテナのデプロイと管理
Genta WatanabeSolutions Architect, Amazon Web Services Japan2017.4.13
なぜコンテナなのか?• コンテナは、真新しい技術ではない
• コンテナは、リソース隔離が元々の由来
• コンテナは、最近DevOpsのために再発見された
• 今や、コンテナはスタートアップからエンタープライズまで支持を得ている
コンテナの長所• イミュータブルなイメージ、ス
テートレス
• スピード(起動時間や開発速度)
• 粒度を細かく利用率を上げられる
コンテナ vs VM
コンテナの短所• ステートフルなやり方はうまく
いかない• ファイルシステムは揮発性• ディスクIOが速くない
• リソースを無駄に使ってしまう• ホスト毎じゃなくタスク毎
ベストプラクティス• アプリをコンテナに適応させる
• 12-Factor app
• 複雑さを避ける• シンプルに保つ
• タスクに集中する• タスク = ジョブの単位• ポータブルに
ベストプラクティス / アンチパターン
アンチパターン• VMベースの処理やワークフロー
• コンテナをVMの様に考える• "ペットと家畜"
• 複雑さを上げてしまう• 多すぎる技術が複雑さを増す• "ヤクの毛を刈る"
• ホスト単位で何かを実行させる• 出来る限りホストのことは忘れる
12-factor App• Herokuのエンジニアが2011年に提唱
– 当時からコンテナを使いこなしているPaaS (Docker登場は2013年)
• このドキュメントの対象者– "サービスとして動くアプリケーションを開発しているすべての開発
者。およびそのようなアプリケーションをデプロイまたは管理しているインフラエンジニア"
– → すなわち全員(今時サービスに関わらないエンジニアはいない)
8
https://12factor.net/ja/
Twelve-Factor
I. コードベース バージョン管理される1つのコードベースと複数デプロイ
II. 依存関係 依存関係を明示的に宣言し分離する
III.設定
設定を環境変数に格納する
IV.バックエンドサービス バックエンドサービスをアタッチされたリソースとして扱う
V. ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを厳密に分離する
VI.プロセス アプリを1つ又は複数のステートレスなプロセスとして実行
VII.ポートバインディング ポートバインディングを通してサービスを公開する
VIII.並行性 プロセスモデルによってスケールアウトする
IX. 廃棄容易性 高速な起動とグレースフル停止で堅牢性を最大化する
X. 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ
XI. ログ ログをイベントストリームとして扱う
XII.管理プロセス 管理タスクを1回限りのプロセスとして実行する
12-factor AppとDocker• 12-factor Appを実行する上で、Dockerは最適
– 依存関係: Dockerfile、Docker Image– 設定: 環境変数– ビルド、リリース、実行: Docker Image, Registry– プロセス: Docker Container– ポートバインディング: Port Mapping– ログ: Logging Driver
• 逆に言えば、12-factor Appでないものを動かす時には一苦労する
10
Docker基本要素
12
CLI Engine Registry
docker builddocker push/pulldocker run Amazon EC2 Container Registry
Windowsコンテナの使用• Windows Serverコンテナ
– プロセスと名前空間の分離テクノロジを使用してアプリケーションを分離
– Windows Server 2016 Base with Containers AMIを用意
• Hyper-Vコンテナ– 専用の仮想マシン上で各コンテナを実行することで分離性を向上– Amazon EC2上では実行できない
サポートされるベースイメージホスト オペレーティング システム
Windows Server コンテナ Hyper-V コンテナ
Windows Server 2016 with Desktop
Server Core / Nano Server
Server Core / Nano Server
Windows Server 2016 Core
Server Core / Nano Server
Server Core / Nano Server
Nano Server Nano Server Server Core / Nano Server
Windows 10 Pro / Enterprise
利用不可 Server Core / Nano Server
14
OSのバージョン• Windows Serverコンテナとベースとなるホスト
はカーネルを共有するため基本イメージのバージョンが一致している必要がある– リビジョン番号が異なる場合は起動をブロックされないが運用環境
ではサポートされない(例:10.0.14393(Windows Server 2016 RTM)と10.0.14393.206 (Windows Server 2016 GA))
• HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersionでWindowsホストのバージョンを確認できる
15
(参考)Docker for Windows• Docker社から無償で提供されているDocker for
Windowsを使用すると、Windows上でLinuxコンテナが利用可能
• Windows 10 Pro/Enterprise 64bit(1511 November Update, Build 10586以降)のHyper-VでLinux仮想マシン(MobyLinuxVM)を動作させる
• Docker CLIでWindows 10上のHyper-Vコンテナとの切り替えが可能
16
Windows Serverコンテナの実行
• Dockerのインストール
• Dockerコンテナの実行
Install-Module -Name DockerMsftProvider -Repository PSGallery -ForceInstall-Package -Name docker -ProviderName DockerMsftProviderRestart-Computer -Force
docker run microsoft/iis
Dockerfileの使用• Dockerfileを使用して新しいコンテナイメージを
作成するために必要な命令をテキストファイルとして記述することが可能
• Docker buildコマンドを実行することでDockerfileから新しいイメージを作成
18
docker build -t iis .
Dockerfileのサンプル# Sample Dockerfile
# Indicates that the windowsservercore image will be used as the base image.FROM microsoft/windowsservercore
# Metadata indicating an image maintainer.MAINTAINER [email protected]
# Uses dism.exe to install the IIS role.RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
# Creates an HTML file and adds content to this file.RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
# Sets a command or process that will run each time a container is run from the new image.CMD [ "cmd" ]
19
コンテナのネットワーク• コンテナは仮想ネットワークアダプター(vNIC)
をもち仮想スイッチ(vSwitch)に接続される– ネットワークアドレス変換(NAT)– 透過(Transparent)– オーバーレイ– L2ブリッジ
• Dockerエンジンはdockerdサービスの初回実行時に規定でNATネットワーク(172.16.0.0/12)を作成する
20
Windows Server 2016 インスタンスでの Docker コンテナの競合• Windows Server 2016インスタンスでDockerを実行するため
には、”Microsoft Windows Server 2016 Base with Container” AMIを使用する必要がある
• 別のWindows Server 2016 AMIからインスタンスを作成する場合、DockerをインストールしてからSysprepを実行するとインスタンスは正しく起動されない
• EC2のデフォルトVPC(172.31.0.0/16)とDocker用のCIDR(172.16.0.0/12)がコンフリクトするのをふせぐためdaemon.jsonで172.17.0.0/16を指定している
しかし、複数台のクラスタ上で管理するのは困難
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
AZ 1 AZ 2
AZ 3
コンテナを扱う上で、最も難しい部分
• 複数ホスト上でのコンテナの管理• 配置、状態の追跡、監視、自動化等• 想像している以上に、たくさんのことを考慮しないといけない
• しかし、これらは70年代から続く分散システムでのよくある問題
• 多くのお客様はアプリケーション開発に集中したい• 内製のコンテナ管理システムは、まるで車輪の再発明• ビジネスの差別化にはつながらないこと
• あなたの時間の多くは、ビジネスを成長させることに使われるべき
{ "name": "simple-demo", "image": "my-demo", "cpu": 10, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "entryPoint": [ "/usr/sbin/apache2", "-D", "FOREGROUND" ], "essential": true },
“Task Definitions”
Tasks
Shared Data Volume
Containers
launchContainer Instance
Volume Definitions
Container Definitions
Amazon ECS コンポーネント
• Task– Instance上で実行されて
いる実際のContainer
• Task Definition– Taskで使うContainer、
及び周辺設定の定義
• Cluster– Taskが実行されるEC2
Instance群
• Manager– ClusterのリソースとTask
の状態を管理
• Scheduler– Clusterの状態をみて、
Taskを配置
• Agent– EC2 InstanceとManager
の連携を司る
Amazon ECS 機能
• Service: ロングランニングアプリケーション• Blue/Greenデプロイ、Auto Scaling、動的ポートマッピング
• Security: セキュアな環境でコンテナを動かす• TaskのIAMロール、PCI DSS
• Simple: インストール不要でAWSネイティブ連携• AWSの標準API/CLI/SDK/CloudFormation、ECS-CLI
Serviceとは?
• ロングランニングアプリケーションを希望する状態に保ち続ける1. Task Definition2. Taskの数3. Load Balancerの登録/解除 (Optional)
• Application Load Balancerとの動的ポートマッピング (Optional)
• コンテナはランダムなホストのポートを使って登録される
• Application Auto ScalingのAmazon ECS Serviceサポート (Optional)
• AlarmとPolicyを使って、希望するTask数を自動的に変更する
Service: 動的ポートマッピング
Service schedulerElastic Load Balancing
Application Load Balancer
Task Definition = app:1Desired Count = 4
Amazon ECS
32874 32879 32873 32880
Cluster
Security: TaskのIAMロール
• 各TaskにIAMロールを指定することができる• Task Definitionで指定したり、run-task時に指定したり
• 利点• 同一のContainer Instance上で異なるIAMロールのTaskが動く• Container InstanceのIAMロールは必要最低限にできる• AWS CloudTrailにTask ARNが含まれるので監査もしやすい
• 前提条件• コンテナ内: AWS SDKは2016年7月13日以降に公開されたもの• Container Instance: ECS Agent 1.12.0+、ネットワークの設定
IAM Role for Task
AWS IAM
Amazon DynamoDB
Amazon S3
Amazon ECS
AWS IAM
AWS IAM
DynamoDBRole
S3Role
Container InstanceECSRole
Amazon ECS is so simple
• マスターサーバ群が不要• クラスタ管理ソフト自体を管理する必要がなくなる• ServiceやRun Taskといった、便利なビルトインスケジューラ
• AWS SDK/CLI/CloudFormationで期待通りの動作• よく定義された標準的なAWS APIが提供• 他のAWSリソースの様にコンテナを操作することができる
• AWSとネイティブな連携• 他のAWSサービスとの連携が、1クリックで設定可能• 例: awslogs => Amazon CloudWatch Logs
Windowsコンテナ(ベータ版)• Amazon ECSでWindowsコンテナをパブリックベー
タとしてサポート– Amazon ECS Container AgentをGitHub上に公開(
https://github.com/aws/amazon-ecs-agent )– Windowsコンテナを実行するためのCloudFormationテンプレートも提供
• 注意点– Linuxコンテナクラスタとの混在はできない– タスクのためのIAMロールに追加の設定が必要– Windows ServerのDockerイメージは比較的大きいためダウンロードには
より多くの時間とストレージ容量が必要
Windowsコンテナの開始(1/2)• Windowsクラスタを作成
• Windowsコンテナインスタンスをクラスタで起動– Microsoft Windows Server 2016 Base with Containers AMIを
選択– ユーザーデータでPowerShellスクリプトを実行することで
Windowsコンテナインスタンスを設定– WindowsコンテナでTaskのIAMロールの機能を使用するには
ECS_ENABLE_TASK_IAM_ROLE環境変数の値をtrueに置き換える
41
$ aws ecs create-cluster --cluster-name windows
Windowsコンテナの開始(2/2)• Amazon ECSクラスタでWindowsコンテナを実
行する前にTask Definitionを定義する
• Task Definitionを使用してサービスを作成
42
$ aws ecs register-task-definition --cli-input-json file://windows-simple-iis.json
$ aws ecs create-service --cluster windows --task-definition windows-simple-iis --desired-count 1 --service-name windows-simple-iis
Task Definitionのサンプル{
"family": "windows-simple-iis",
"containerDefinitions": [
{
"name": "windows_sample_app",
"image": "microsoft/iis",
"cpu": 100,
"entryPoint":["powershell", "-Command"],
"command":["New-Item -Path C:\\inetpub\\wwwroot\\index.html -Type file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>'; C:\\ServiceMonitor.exe w3svc"],
"portMappings": [
{
"protocol": "tcp",
"containerPort": 80,
"hostPort": 80
}
],
"memory": 500,
"essential": true
}
]
}43
Windows Task用のIAMロール設定• コンテナインスタンスの起動スクリプトで
ECS_ENABLE_TASK_IAM_ROLE環境変数を設定
• ブートストラップスクリプトに提供されているネットワーキングコマンドを使用してコンテナをブートストラップ
• Task用のIAMロールとポリシーを作成
• Task用に作成したIAMロールをTask Definitionの登録時に指定
• Task認証プロバイダーのIAMロールではコンテナインスタンスのポート80を使用する
44
タスク用のIAMロールのブートストラップスクリプト# Copyright 2014-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.## Licensed under the Apache License, Version 2.0 (the "License"). You may# not use this file except in compliance with the License. A copy of the# License is located at## http://aws.amazon.com/apache2.0/## or in the "license" file accompanying this file. This file is distributed# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either# express or implied. See the License for the specific language governing# permissions and limitations under the License.
$gateway = (Get-WMIObject -Class Win32_IP4RouteTable | Where { $_.Destination -eq '0.0.0.0' -and $_.Mask -eq '0.0.0.0' } | Sort-Object Metric1 | Select NextHop).NextHop$ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndexNew-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway
45
WindowsコンテナのAWS CloudFormationテンプレート• 以下のリソースをふくむサ
ンプルアプリケーションを実行するテンプレートを提供– Amazon ECSクラスタ– Task Definition– Service– Application Load Balancer
(ALB)– Auto Scalingポリシー
• 3種類のIAMロールをあわせて作成
46
Amazon EC2 Container Service• 機能
• Service: ロングランニングアプリケーション• Security: セキュアな環境でコンテナを動かす• Simple: インストール不要でAWSネイティブ連携
• 事例• 沢山のAmazon ECSのお客様 • 高速なアップデート• 全てがお客様のフィードバックに基づく
まとめ• アプリケーションをコンテナで最適に実行するた
めには12-factor Appを意識
• Dockerを使用してWindowsアプリケーションのコンテナ化が可能に
• Amazon ECSはコンテナ管理のための最適なプラットフォーム
49
参考情報• 12-factor APP
– https://12factor.net/ja/– https://www.infoq.com/presentations/12-Principles-Deploy-Apps
• Windowsコンテナー– https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/
• Amazon EC2 Container Service– https://aws.amazon.com/ecs/
51