#Amazon ECSのネットワークモードに awsvpc が追加されました。
これ選択すると、タスクごとにENIが割り当てられ、VPCのIPアドレスでアクセスできるようになります。
またENIに対してセキュリティグループを設定できるので、これまでのようにホストのセキュリティグループを
共有しなくてよくなるという意味でよりセキュアになります。
日本語訳の技術Blogも公開されていますので、その他のメリットなど
詳細についてはこちらを参照いただければと思います。
https://aws.amazon.com/jp/blogs/news/introducing-cloud-native-networking-for-ecs-containers/
試してみる
ECSのサンプルアプリケーションを起動してみます
https://github.com/awslabs/ecs-demo-php-simple-app
タスク定義の作成
すでにサンプルアプリの定義が存在したため、新しいリビジョンを作成しました。
ネットワークモードをbridgeからawsvpcへ変更します。
タスク内のコンテナはENIを共有するため、ポートマッピングはコンテナ側のポートのみが指定可能です。
サービスの作成
既存のecs-test-clusterというECSクラスター上にecs-test-serviceというサービスを追加してみます。
タスク定義では先ほどネットワークモードを awsvpc に設定したリビジョンを選択します。
ネットワーク構成の画面ではawsvpcを選択しているとVPC、サブネット、セキュリティグループを
それぞれ指定することができます。
例えばport 80を開ける場合、これまではECSインスタンスのセキュリティグループに許可設定を入れる必要が
ありましたが、こちらで個別に設定ができるようになります。
タスクの実行結果
タスクの詳細画面を確認すると、NetworkでVPCのPrivate IPを確認することができます。
EC2のダッシュボード上でもECSインスタンスに対し、ENIが追加されていることを確認できました。
コンテナインスタンス上で docker ps コマンドを実行すると、これまでのamazon-ecs-agentの他に
amazon-ecs-pause というコンテナが実行されていることが確認できました。
[ec2-user@ip-172-16-0-159 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
XXXXXXXXXXXX XXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/XXXX:latest "/usr/sbin/apache2..." 5 minutes ago Up 5 minutes ecs-console-sample-app-static-2-sample-app-
XXXXXXXXXXXX amazon/amazon-ecs-pause:0.1.0 "./pause" 5 minutes ago Up 5 minutes ecs-console-sample-app-static-2-internalecspause-
XXXXXXXXXXXX amazon/amazon-ecs-agent:latest "/agent" 2 hours ago Up 2 hours ecs-agent
VPCのIPアドレスに対してリクエストを送ること、サンプルアプリケーションが正常に
実行されていることを確認できました。
[ec2-user@ip-172-16-0-159 ~]$ curl http://172.16.0.207
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Simple PHP App</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="assets/css/bootstrap.min.css" rel="stylesheet">
<style>body {margin-top: 40px; background-color: #333;}</style>
<link href="assets/css/bootstrap-responsive.min.css" rel="stylesheet">
<!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
</head>
<body>
<div class="container">
<div class="hero-unit">
<h1>Simple PHP App</h1>
<h2>Congratulations</h2>
<p>Your PHP application is now running on a container in Amazon ECS.</p>
<p>The container is running PHP version 5.3.10-1ubuntu3.26.</p>
もちろんサービス作成時にELBを設定していれば、ELB経由でアクセスできます。
注意点
インスタンス毎のENI制限
EC2のインスタンスタイプ毎にENI数の制限がありますが、ECSはEC2上で実行されるため、
この制限が適用されます。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI
今回のテストで使用したクラスターはEC2 インスタンスタイプを t2.microに設定していたため、
ネットワークインターフェースの上限は 2 です。
試しにサービスを追加してみると以下のようなエラーで正常にタスクを起動できません。
service ecs-test-service2 was unable to place a task
because no container instance met all of its requirements.
The closest matching container-instance xxxxxxxxxxxx encountered error "RESOURCE:ENI".
For more information, see the Troubleshooting section.
コンテナの起動時間
正確な実測はできていませんが、
VPC Lambdaと同じような理屈でコンテナの起動が遅くなる可能性があるのではないかと
参考になれば幸いです。
以上です。