Closed13

terraformでECS+ALBを動かす

not75743not75743

使うアプリはGrowi(別のEC2にmongodb、elasticsearch導入済み)

構成図
保留

以下terraformで作成予定のリソース

  • ECS用セキュリティグループ
  • ECS(Growi)
    • タスク定義用IAMロール
    • ECSタスク定義
    • ECSクラスター
    • ECSサービス
  • ALB
    • ターゲットグループ
    • リスナー
not75743not75743

セキュリティグループ作成

以下を見て設定
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule

前者のみで複数のルールを作成できるため、後者は使う必要があるかわからん
↓をapplyするとそれぞれルールが作成される

main.tf
resource "aws_security_group" "test-sg" {
...
  ingress{
    from_port         = 3000
    to_port           = 3000
    protocol          = "TCP"
    cidr_blocks       = ["${var.myip}/32"]
  }
  ingress{
    from_port         = 5000
    to_port           = 5000
    protocol          = "TCP"
    cidr_blocks       = ["${var.myip}/32"]
  }
  ingress{
    from_port         = 8000
    to_port           = 8000
    protocol          = "TCP"
    cidr_blocks       = ["${var.myip}/32"]
  }
not75743not75743

タスク定義用のIAMロール作成

これ必要でした

main.tf
resource "aws_iam_role" "ecs_task_execution_role" {
  name               = "ecs_task_execution_role"
  assume_role_policy = jsonencode({
    Version   = "2012-10-17"
    Statement = [
      {
        Effect    = "Allow"
        Principal = { Service = "ecs-tasks.amazonaws.com" }
        Action    = "sts:AssumeRole"
      }
    ]
  })
  managed_policy_arns = [
    "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy",
  ]
}

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_execution_IAM_role.html

not75743not75743

ALBを入れる

使うリソース

  • aws_lb
  • aws_lb_listner
  • aws_lb_listener_rule
  • aws_lb_target_group
    • ターゲットグループの情報をかく
  • aws_lb_target_group_attachment
    • ターゲットの対象をかく(arninstance-id
not75743not75743

awsvpcネットワークモードの場合、ターゲットグループタイプはIPでなくてはならない

https://aws.amazon.com/jp/premiumsupport/knowledge-center/create-alb-auto-register/

[Target type] (ターゲットタイプ) で、[Instance] (インスタンス) または [IP] を選択します。
重要: サービスのタスク定義で awsvpc ネットワークモード (AWS Fargate 起動タイプで必須) を使用している場合は、ターゲットタイプとして [IP] を選択する必要があります。これは、awsvpc ネットワークモードを使用するタスクが Elastic Network Interface に関連付けられているためです。これらのタスクは、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスには関連付けられていません

not75743not75743

ALBのターゲットグループが再生成できない

エラーログはこんな感じ

Error: deleting Target Group: ResourceInUse: Target group 'arn:aws:elasticloadbalancing:ap-northeast-1:***:targetgroup/alb-tg/xxxxxxxxxxxxxxx' is currently in use by a listener or a rule

ロードバランサと紐付いていることが原因。
設定変更が必要だったため、以下参考に対処した。ありがとうございます。
https://thaim.hatenablog.jp/entry/2021/01/11/004738

not75743not75743

growiにアクセスするとインストールページにリダイレクトされるため

ヘルスチェックの対象を200のみにしていると引っかかる
今回は302を追加して対処した

main.tf
resource "aws_lb_target_group" "alb-tg" {
... 略 ...
  health_check {
... 略 ...
    matcher             = "200,302"
not75743not75743

アクセス確認

aws_ecs_serviceでALBとターゲットグループを指定することで、ALBコンテナの通信が実現する
動作確認し、リダイレクトの後インストールページにアクセスできることを確認する

$ curl -L -I http://growi-alb-1330507823.ap-northeast-1.elb.amazonaws.com
HTTP/1.1 302 Found
... 略 ...

HTTP/1.1 200 OK
... 略 ...

ヨシ

not75743not75743

おわり

growi動作確認のため、いったんクローズ
今後監視、ローリングアップデートなどの設定を追加する

このスクラップは2023/01/07にクローズされました