AWS FargateをAWS CLIで扱いつつ、従来のAPIとの差分を調べた #reinvent
re:Invent 2017で発表されたAWS Fargateは、EC2を起動せずにコンテナを実行できるようにするためのElastic Container Service(ECS)の拡張機能です。
昨日、弊社諏訪からecs-cliを利用してFargateのデプロイを行う記事が投稿されていました。
ECS CLIではなく、標準の低レベルAPIを利用してデプロイを行うのはどうしたらいいのだろう、と思い調べてみると、公式ドキュメントにサンプルアプリのデプロイをAWS CLIを使って行うWalkthroughがありました。
この投稿では、walkthroughを実施して実際にFargateのタスクが動くことを確かめつつ、従来のECS APIからの変更がどのあたりにあるのか、を私なりにまとめてみることにします。
1. (Optional)ECS Clusterの作成
ECS Clusterを作成します。ECS ClusterはFargateがリリースされていない時に作ったものでもそのまま使えるので、既にClusterを作成済の人はこの手順をスキップしても問題ありません。
$ aws ecs create-cluster --cluster-name fargate-cluster --region us-east-1 { "cluster": { "status": "ACTIVE", "statistics": [], "clusterName": "fargate-cluster", "registeredContainerInstancesCount": 0, "pendingTasksCount": 0, "runningTasksCount": 0, "activeServicesCount": 0, "clusterArn": "arn:aws:ecs:us-east-1:123456789012:cluster/fargate-cluster" } }
2. TaskDefinitionの登録
$ cat tas_definition.json { "family": "sample-fargate", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "fargate-app", "image": "httpd:2.4", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<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> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" }
ここで注目すべきはrequiresCompatibilities
の項目です。APIドキュメントにはこう書かれています。
The launch type required by the task. If no value is specified, it defaults to EC2.
Type: Array of strings
Valid Values: EC2 | FARGATE
Required: No
つまり、Fargateで起動するためにはrequiresCompatibilities
にFARGATE
というパラメータを追加する必要があります。TypeがArray of stringsとなっているので、「EC2とFargate、どちらでも起動可能なTask」という設定も可能なようです。
その他のパラメータは以前と差はなさそうです。このtask definitionを登録してみましょう。
$ aws ecs register-task-definition --cli-input-json file://task_definition.json --region us-east-1 (output snip)
TaskDefinitionのJSONが表示されたら登録完了です。
3. Serviceの開始
それでは、登録したTaskDefinitionをServiceとして開始してみましょう。ここで気をつける部分は2つ、--launch-type
パラメータと--network-configuration
です。
--launch-type
に"FARGATE"
を指定することで、Fargateでコンテナが起動するようになります。また、Fargateは先日発表されたawsvpcネットワーキングを利用するため、--network-configuration
にはENIを起動するサブネットID、紐付けるSecurityGroupのID、PublicIPのAssign有無を設定する必要があります。
それでは実行しましょう。subnetIDとSecurityGroupIDはご自身の環境のものに書き換えて実行してください。
$ aws ecs create-service \ --cluster fargate-cluster \ --service-name fargate-service \ --task-definition sample-fargate:1 \ --desired-count 1 \ --launch-type "FARGATE" \ --network-configuration "awsvpcConfiguration={subnets=[subnet-abcdef01],securityGroups=[sg-abcdef01],assignPublicIp=ENABLED}" \ --region us-east-1 { "service": { "status": "ACTIVE", "taskDefinition": "arn:aws:ecs:us-east-1:123456789012:task-definition/sample-fargate:2", "pendingCount": 0, "launchType": "FARGATE", "loadBalancers": [], "roleArn": "arn:aws:iam::123456789012:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS", "placementConstraints": [], "createdAt": 1512080838.578, "desiredCount": 1, "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-abcdef01" ], "securityGroups": [ "sg-abcdef01" ], "assignPublicIp": "ENABLED" } }, "platformVersion": "LATEST", "serviceName": "fargate-service", "clusterArn": "arn:aws:ecs:us-east-1:123456789012:cluster/fargate-cluster", "serviceArn": "arn:aws:ecs:us-east-1:123456789012:service/fargate-service", "deploymentConfiguration": { "maximumPercent": 200, "minimumHealthyPercent": 100 }, "deployments": [ { "status": "PRIMARY", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-abcdef01" ], "securityGroups": [ "sg-abcdef01" ], "assignPublicIp": "ENABLED" } }, "pendingCount": 0, "launchType": "FARGATE", "createdAt": 1512080838.578, "desiredCount": 1, "taskDefinition": "arn:aws:ecs:us-east-1:123456789012:task-definition/sample-fargate:2", "updatedAt": 1512080838.578, "platformVersion": "1.0.0", "id": "ecs-svc/9223370524773937228", "runningCount": 0 } ], "events": [], "runningCount": 0, "placementStrategy": [] } }
こんな感じのJSONが帰ってきたら成功です。その後、Taskに紐付けられたENIの画面からPublicIPを確認し、ブラウザでアクセスしてみましょう。
ENIの情報はAWS Management ConsoleのTaskの詳細画面から取得可能です。(下記画像参照)そのリンクに飛ぶとPublic IPを取得可能です。
ブラウザでアクセスしてみると、HTMLが表示できました!EC2を作らなくとも、コンテナが起動できるようになるのは本当に便利ですね。
まとめ
今回は、AWS CLIを使いながらFargateの起動方法、また従来のECSとの違いを追っていきました。API的に一番大きな違いはcreate-service
の時に--launch-type
を指定することと、awsvpcネットワークモードでの起動が必須になったことでしょうか。