0
0

概要

今まで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

ネットワークモードには他にもbridgehostがあります。詳しくは公式ドキュメントご参照下さい。

注意点2:コンテナポートのみをマッピングする

networkModeawsvpcの場合、ポートマッピング内のホストポートとコンテナポートが一致していないといけません。同じ数字にしても良いですが、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.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0