概要
今までAWS ECS on EC2を使っており、Fargateを使ったことがありませんでした。そこで、EC2で構築した際とFargateを利用した際を比較すると、Fargate構築時のみの注意点があると感じたので紹介します(特にCloudformationを利用して作成すると感じた点になります)。
注意点1:ネットワークモードはawsvpc
そもそもFargetはサーバーレスモデルなので、EC2ではなく、タスクにプライベートIPアドレス(正確にはENI)が割り当てられる形です。そのため、ネットワークモードはawsvpcのみをサポートする形になっています。
公式ドキュメントにも以下のように記載されています。
Fargate 起動タイプを使用している場合、awsvpc ネットワークモードが必要です。
引用元:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html
ネットワークモードには他にもbridgeやhostがあります。詳しくは公式ドキュメントご参照下さい。
注意点2:コンテナポートのみをマッピングする
networkModeがawsvpcの場合、ポートマッピング内のホストポートとコンテナポートが一致していないといけません。同じ数字にしても良いですが、Fargateではポートマッピングが動的に行われるため、コンテナポートのみを指定すれば良いです。HostPortを記載しない方が一般的かと思います。
# NG例
PortMappings:
-
ContainerPort: 80
HostPort: 0
Protocol: "tcp"
# OK例
PortMappings:
-
ContainerPort: 80
Protocol: "tcp"
異なるポート番号を指定した場合、エラーメッセージは以下になります。
Invalid request provided: Create TaskDefinition: When networkMode=awsvpc, the host ports and container ports in port mappings must match
注意点3:特定のCPUとメモリの組み合わせにする
FARGATEを使用している場合、特定のCPUとメモリの組み合わせを指定しない場合にエラーが発生します。例えば、CPUが256(.25 vCPU)の場合は、メモリは0.5GBから2GBの範囲である必要があります。
公式ドキュメントにも以下のように記載されています。
requiresCompatibilities パラメータに FARGATE を指定しているタスク定義については (EC2 も指定されている場合も)、次の表のいずれかの値を使用する必要があります。これらの値によって、CPU とメモリのパラメータでサポートされる値の範囲が決まります。
引用元:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-cpu-memory-error.html
上記の表に該当しない組み合わせを入れるとエラーになります。
エラーメッセージは以下。
Resource handler returned message: "Invalid request provided: Create TaskDefinition: No Fargate configuration exists for given values: 900 CPU, 3400 memory. See the Amazon ECS documentation for the valid values.
注意点4:ターゲットタイプはip
ECSタスクがawsvpcネットワークモードで実行される場合、ELBのターゲットグループのターゲットタイプはipである必要があります。先述の通り、awsvpcネットワークモードでは、各タスクにENI(Elastic Network Interface)が割り当てられ、タスクはそのENIのIPアドレスを使用して通信します。固有のIPアドレスを持っているため、このタイプではないといけないんですね。
そのため、ターゲットグループはタスクのIPアドレスをターゲットとして使用するように設定する必要があるのです。ターゲットグループの定義でTargetTypeプロパティがあるので、その値をipに設定する必要があります。具体的には以下の通り。
TargetGroup:
Type: "AWS::ElasticLoadBalancingV2::TargetGroup"
Properties:
HealthCheckIntervalSeconds: 5
HealthCheckPath: "/"
HealthCheckPort: "traffic-port"
HealthCheckProtocol: "HTTP"
HealthCheckTimeoutSeconds: 2
HealthyThresholdCount: 2
UnhealthyThresholdCount: 2
Matcher:
HttpCode: "200"
Name: !Sub ${SysTag}-xxx
Port: 80
Protocol: "HTTP"
TargetType: "ip" ## これを追加
VpcId: !Ref VpcId
TargetGroupAttributes:
-
Key: deregistration_delay.timeout_seconds
Value: 0
ipを指定しない場合(ターゲットタイプがインスタンスになってしまっている場合)、以下のエラーメッセージが表示されます。
Resource handler returned message: "Invalid request provided: CreateService error: The provided target group arn:aws:elasticloadbalancing:ap-northeast-1:1234567890123:targetgroup/xxxxx-xxxx/xxxx has target type instance, which is incompatible with the awsvpc network mode specified in the task definition.