FargateでWebサーバ立てるときの注意点等メモ

例えばこんなの

ポイント

サンプルコードはTerraformで記載しています。


SSHコンテナはデバッグ用に

SSHコンテナの作り方はコチラを参考にされるのがよいかと思います。
また、最初はassign_public_ipをtrueにして、パブリックIPを付与しておくとコンテナへのアクセスがより楽になります。

resource "aws_ecs_service" "web-service" {
  ...(省略)

  network_configuration {
    subnets           = ["${lookup(var.alb, "${terraform.workspace}.subnet_ids_AZ_a")}", "${lookup(var.alb, "${terraform.workspace}.subnet_ids_AZ_c")}"]
    security_groups   = ["${aws_security_group.SG-ALB-External-WEB.id}"]
    assign_public_ip  = "true"
  }
}

振られたIPに対して接続できます。

ssh root@パブリックIP

ALBのスティッキーセッションを有効に

例えばWordpressを立てるときに、スティッキーセッションを有効にしていないと、
ログイン画面でループ地獄に陥りました。


コンテナ間接続について

awsvpc ネットワークモードが必須なFargateではコンテナのLink機能が使えないため、
以下のような感じになるかと思います。

  • 共有ボリュームでコンテナ間のファイル共有
  • local(127.0.0.1)接続する

例えばEC2モードでは

php:9000

で接続できてたものが

127.0.0.1:9000

のように置き換わります。


ログについて

Fargateでは現状awslogs(Cloudwatch Logs)のみ対応しています。

resource "aws_ecs_task_definition" "web-task-definition" {
  ...(省略)

  container_definitions = <<JSON
  [
    {
      ...(省略)       

      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/fargate/service/${lookup(var.common, "project")}-${terraform.workspace}",
          "awslogs-region": "${lookup(var.common, "region")}",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ]
  JSON
}

resource "aws_cloudwatch_log_group" "logs" {
  name              = "/fargate/service/${lookup(var.common, "project")}-${terraform.workspace}"
  retention_in_days = "14"
}

EC2モードに比べてFargateは起動に時間がかかる

health_check_grace_period_secondsで設定した時間までにコンテナが立ち上がらないと
ECSがコンテナの立ち上げ失敗と判断して新たなコンテナを立ち上げます。そしてループに陥ります。

EC2ではすぐに起動できたものも、Fargateでは少し時間がかかる場合
health_check_grace_period_secondsの設定が必要になってきます。

resource "aws_ecs_service" "web-service" {
  name                               = "web-service"
  cluster                            = "${aws_ecs_cluster.web-cluster.id}"
  task_definition                    = "${aws_ecs_task_definition.web-task-definition.arn}"
  launch_type                        = "FARGATE"
  desired_count                      = 2      # 必要数
  health_check_grace_period_seconds  = "7200" # コンテナの立ち上げ猶予時間 
  deployment_maximum_percent         = 200    # 最大4台の意味(必要数 * 200%)
  deployment_minimum_healthy_percent = 100    # 最低2台の意味(必要数 * 100%)

  ...(省略)
}

コンテナの起動順について

FargateではLink機能がないため、依存制御できないようです。
もし他コンテナの立ち上げを待つ必要がある場合はentrypoint.shなどで自前制御させます。


S3など他AWSサービスへのアクセス

ロールを設定できます。ので、アクセスキーを環境変数で持たせるようなことをなくせます。

例えばS3の読み取り権限を付けたい場合は以下のようにAmazonS3ReadOnlyAccessを付与します。

AmazonECSTaskExecutionRolePolicyはタスクを実行するのに必須です。

roleを定義したら execution_role_arnに設定します

resource "aws_ecs_task_definition" "web-task-definition" {
  family                   = "web-task-definition"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = "512"
  memory                   = "1024"
  task_role_arn            = "${aws_iam_role.task_role.arn}"
  execution_role_arn       = "${aws_iam_role.task_role.arn}"

  ...(省略)
}

resource "aws_iam_role" "task_role" {
  name               = "task_role"
  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "task-attach" {
    role       = "${aws_iam_role.task_role.name}"
    policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}

resource "aws_iam_role_policy_attachment" "s3-readonly-attach" {
    role       = "${aws_iam_role.task_role.name}"
    policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}
サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする