53
Amazon EC2 Container Service (ECS)に よるWindowsコンテナのデプロイと管理 Genta Watanabe Solutions Architect, Amazon Web Services Japan 2017.4.13

20170413 aws–windows users meetup

Embed Size (px)

Citation preview

Amazon EC2 Container Service (ECS)によるWindowsコンテナのデプロイと管理

Genta WatanabeSolutions Architect, Amazon Web Services Japan2017.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 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

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

launchContainer 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 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のお客様 • 高速なアップデート• 全てがお客様のフィードバックに基づく

まとめ

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