Amazon EC2 Container Service (ECS)に
よるWindowsコンテナのデプロイと管理
Genta Watanabe
Solutions Architect, Amazon Web Services Japan
2017.4.13
Agenda
• コンテナとは?
• DockerとWindowsコンテナ
• Amazon EC2 Container Service (ECS)
• まとめ
2
コンテナとは何か?
• OS仮想化
• プロセス隔離
• イメージ
• 自動化Server
Guest OS
Bins/Libs Bins/Libs
App2App1
なぜコンテナなのか?
• コンテナは、真新しい技術ではない
• コンテナは、リソース隔離が元々の由来
• コンテナは、最近DevOpsのために再発見された
• 今や、コンテナはスタートアップからエンタープ
ライズまで支持を得ている
コンテナの長所
• イミュータブルなイメージ、ス
テートレス
• スピード(起動時間や開発速度)
• 粒度を細かく利用率を上げられ
る
コンテナ vs VM
コンテナの短所
• ステートフルなやり方はうまく
いかない
• ファイルシステムは揮発性
• ディスクIOが速くない
• リソースを無駄に使ってしまう
• ホスト毎じゃなくタスク毎
ベストプラクティス
• アプリをコンテナに適応させる
• 12-Factor app
• 複雑さを避ける
• シンプルに保つ
• タスクに集中する
• タスク = ジョブの単位
• ポータブルに
ベストプラクティス / アンチパターン
アンチパターン
• VMベースの処理やワークフロー
• コンテナをVMの様に考える
• "ペットと家畜"
• 複雑さを上げてしまう
• 多すぎる技術が複雑さを増す
• "ヤクの毛を刈る"
• ホスト単位で何かを実行させる
• 出来る限りホストのことは忘れる
The Twelve-Factor App
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 build
docker push/pull
docker 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_MACHINESoftwareMicrosoft
Windows NTCurrentVersionで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 -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-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 jshelton@contoso.com
# 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:inetpubwwwrootindex.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
Bins/Libs Bins/Libs
App2App1
1台のサーバ上でDockerを扱うのは簡単
しかし、複数台のクラスタ上で管理するのは困難
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年代から続く分散システムでのよくある問題
• 多くのお客様はアプリケーション開発に集中したい
• 内製のコンテナ管理システムは、まるで車輪の再発明
• ビジネスの差別化にはつながらないこと
• あなたの時間の多くは、ビジネスを成長させることに使われるべき
Amazon EC2 Container Service
Amazon EC2 Container Service (ECS)
コンテナ管理を
あらゆるスケールで
柔軟なコンテナの配置 AWSの基盤との連携
コンテナ管理とは?
• 利用可能なリソースを管理
• リソースの変化を追跡
• リソースへのリクエストを受け付ける
• 正確性と一貫性を保証する
CPU
メモリ
ポート
ディスク容量
ディスクIOPS
ネットワーク帯域
リソース
{
"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
launch
Container
Instance
Volume Definitions
Container Definitions
スケジューラとは?
• 必要な状態を決める
• 現在の状態と比較する
• アクションを実行する
Cluster, Scheduler, Task Scheduler
ManagerCluster
Task Definition
Task
Agent
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 Definition
2. Taskの数
3. Load Balancerの登録/解除 (Optional)
• Application Load Balancerとの動的ポートマッピング
(Optional)
• コンテナはランダムなホストのポートを使って登録される
• Application Auto ScalingのAmazon ECS Serviceサポート
(Optional)
• AlarmとPolicyを使って、希望するTask数を自動的に変更する
Service: 動的ポートマッピング
Service scheduler
Elastic Load Balancing
Application Load Balancer
Task Definition = app:1
Desired 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 Instance
ECSRole
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:inetpubwwwrootindex.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).ifIndex
New-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のお客様
• 高速なアップデート
• 全てがお客様のフィードバックに基づく
まとめ
48
まとめ
• アプリケーションをコンテナで最適に実行するた
めには12-factor Appを意識
• Dockerを使用してWindowsアプリケーションの
コンテナ化が可能に
• Amazon ECSはコンテナ管理のための最適なプラ
ットフォーム
49
Q&A
50
参考情報
• 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
ご参加ありがとうございました
52
53

20170413 aws–windows users meetup