terraformでECS+ALBを動かす
使うアプリはGrowi(別のEC2にmongodb、elasticsearch導入済み)
構成図
保留
以下terraformで作成予定のリソース
- ECS用セキュリティグループ
- ECS(Growi)
- タスク定義用IAMロール
- ECSタスク定義
- ECSクラスター
- ECSサービス
- ALB
- ターゲットグループ
- リスナー
セキュリティグループ作成
以下を見て設定
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するとそれぞれルールが作成される
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"]
}
タスク定義用のIAMロール作成
これ必要でした
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",
]
}
タスク定義の作成
コンテナ内部環境変数の設定方法は以下、ドキュメントを注視されたし
container_definitions = <<TASK_DEFINITION
[
{
"environment": [
{"name": "VARNAME", "value": "VARVAL"},
{"name": "VARNAME2", "value": "VARVAL2"}
],
ECSクラスタ
ECSサービス
ALBを入れる
使うリソース
- aws_lb
- aws_lb_listner
- aws_lb_listener_rule
- aws_lb_target_group
- ターゲットグループの情報をかく
- aws_lb_target_group_attachment
- ターゲットの対象をかく(
arn
、instance-id
)
- ターゲットの対象をかく(
aws_lb_target_group_attachment
は不要
ecsサービスのload_balancer
>target_group_arn
で設定するため
ARN of the Load Balancer target group to associate with the service.
awsvpc
ネットワークモードの場合、ターゲットグループタイプはIP
でなくてはならない
[Target type] (ターゲットタイプ) で、[Instance] (インスタンス) または [IP] を選択します。
重要: サービスのタスク定義で awsvpc ネットワークモード (AWS Fargate 起動タイプで必須) を使用している場合は、ターゲットタイプとして [IP] を選択する必要があります。これは、awsvpc ネットワークモードを使用するタスクが Elastic Network Interface に関連付けられているためです。これらのタスクは、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスには関連付けられていません
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
ロードバランサと紐付いていることが原因。
設定変更が必要だったため、以下参考に対処した。ありがとうございます。
growiにアクセスするとインストールページにリダイレクトされるため
ヘルスチェックの対象を200
のみにしていると引っかかる
今回は302
を追加して対処した
resource "aws_lb_target_group" "alb-tg" {
... 略 ...
health_check {
... 略 ...
matcher = "200,302"
アクセス確認
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
... 略 ...
ヨシ
おわり
growi動作確認のため、いったんクローズ
今後監視、ローリングアップデートなどの設定を追加する