#概要
ECS上でコンテナ化したRailsアプリを動かす
(ダラダラ書いてるので分割予定)
デプロイ設定は以下で
https://qiita.com/kinoshita-yu/items/6d3b07b968ff5810e489
#前提
####構成
- rails
- RDS
- ECS(Fargate)
#VPCの作成
割愛:追記予定
#RDSの設定
割愛:追記予定
#ELBの設定
BlueとGreen用に2つのポートからのターゲットを受け取るように設定する
###ターゲットグループの作成(2つ作成)
- https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#TargetGroups: に移動
- 「ターゲットグループの作成」をクリック
- 「ターゲットグループ名」に任意の名前を設定
- 「ターゲットの種類」にIPを設定
- 「プロトコル」にHTTPを設定
- 「ポート」に3000、3001を設定
- 「VPC」に作成したものを設定
- 「ヘルスチェックの設定」以下は任意に設定
- 「作成」をクリック
###ロードバランサの作成
- https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers: に移動
- 「ロードバランサの作成」をクリックし、「Application Load Balancer」の「作成」をクリック
- 「名前」「スキーム」「IPアドレスタイプ」に適切なものを設定
- セキュリティーグループの設定
- 作成したターゲットグループを設定
#ECS:Fargate設定
###タスク定義用のポリシー作成
- https://console.aws.amazon.com/iam/home?#/policies に移動
- 「ポリシーの作成」をクリックし「JSON」タブをクリック
- 以下「▶︎タスク定義用ポリシー」のように設定し「ポリシーの確認」をクリック
タスク定義用ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:CompleteLayerUpload",
"ecr:UploadLayerPart",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:BatchDeleteImage",
"ecr:InitiateLayerUpload",
"ssm:GetParametersByPath",
"ssm:GetParameters",
"ssm:GetParameter",
"ssm:PutParameter"
],
"Resource": [
"arn:aws:ecr:ap-northeast-1:XXXXXXXXXX:repository/app",
"arn:aws:ssm:ap-northeast-1:XXXXXXXXXX:parameter/app/*"
]
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:CreateLogGroup",
"ecs:RegisterTaskDefinition",
"ecr:GetAuthorizationToken"
],
"Resource": "*"
},
{
"Sid": "VisualEditor3",
"Effect": "Allow",
"Action": [
"events:PutRule",
"events:PutTargets",
"events:DisableRule"
],
"Resource": [
"arn:aws:events:ap-northeast-1:XXXXXXXXXX:rule/app-*"
]
},
{
"Sid": "VisualEditor4",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::XXXXXXXXXX:role/ecs_app"
]
}
]
}
###タスク定義用のロール作成
- https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles に移動
- 「ロールの作成」をクリック
- 上記で作成したポリシーを設定
###タスク定義作成
- https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/taskDefinitions に移動
- 「新しいタスク定義の作成」をクリックし「FARGATE」を選択
- 「JSONによる設定」ボタンをクリックし以下「▶︎タスク定義」のような記述を行う
※ 環境変数はSystemsManagerで定義
タスク定義
{
"ipcMode": null,
"executionRoleArn": "arn:aws:iam::XXXXXXXXXX:role/「上で作成したロール」",
"containerDefinitions": [
{
"dnsSearchDomains": null,
"logConfiguration": {
"logDriver": "awslogs",
"secretOptions": null,
"options": {
"awslogs-group": "/XXX/XXXXXXXX",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
},
"entryPoint": null,
"portMappings": [
{
"hostPort": 3000,
"protocol": "tcp",
"containerPort": 3000
}
],
"command": [
"/bin/sh",
"-c",
"rails s -p 3000 -b 0.0.0.0"
],
"linuxParameters": null,
"cpu": 0,
"environment": [],
"resourceRequirements": null,
"ulimits": null,
"dnsServers": null,
"mountPoints": [],
"workingDirectory": null,
"secrets": [
{
"valueFrom": "/XXXXX/APP_DATABASE_HOST",
"name": "APP_DATABASE_HOST"
},
{
"valueFrom": "/XXXXX/APP_DATABASE_NAME",
"name": "APP_DATABASE_NAME"
},
{
"valueFrom": "/XXXXX/APP_DATABASE_PASSWORD",
"name": "APP_DATABASE_PASSWORD"
},
{
"valueFrom": "/XXXXX/APP_DATABASE_USER",
"name": "APP_DATABASE_USER"
}
],
"dockerSecurityOptions": null,
"memory": null,
"memoryReservation": null,
"volumesFrom": [],
"stopTimeout": null,
"image": "XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/XXXXX/app@sha256:XXXXXXXXXX",
"startTimeout": null,
"dependsOn": null,
"disableNetworking": null,
"interactive": null,
"healthCheck": null,
"essential": true,
"links": null,
"hostname": null,
"extraHosts": null,
"pseudoTerminal": null,
"user": null,
"readonlyRootFilesystem": null,
"dockerLabels": null,
"systemControls": null,
"privileged": null,
"name": "XXXXXXXXXX"
}
],
"placementConstraints": [],
"memory": "1024",
"taskRoleArn": null,
"compatibilities": [
"EC2",
"FARGATE"
],
"taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXX:task-definition/XXXXX:5",
"family": "XXXXX",
"requiresAttributes": [
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.execution-role-awslogs"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.ecr-auth"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.execution-role-ecr-pull"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.secrets.ssm.environment-variables"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.task-eni"
}
],
"pidMode": null,
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "512",
"revision": 5,
"status": "ACTIVE",
"inferenceAccelerators": null,
"proxyConfiguration": null,
"volumes": []
}
###クラスタ作成
- https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/clusters に移動
- 「クラスターの作成」ボタンをクリック
- 「クラスターテンプレートの選択」画面で「AWSFargateを使用」を選択し「次のステップ」をクリック
- 「クラスターの設定」画面に移動
- 「クラスター名」を入力
- 「VPCの作成」にチェックを入れない
- 「CloudWatchContainerInsights」にチェックを入れる
###CodeDeploy用のロール作成
- https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles に移動
- 「ロールの作成」をクリック
- 「AWSサービス」→「CodeDeploy」→「CodeDeploy-ECS」と選択し「次のステップ:アクセス権限」をクリック
- 「AWSCodeDeployRoleForECS」ポリシーが表示されていることを確認し「次のステップ:タグ」をクリック
- 任意のタグを設定したら「次のステップ:確認」をクリックし、問題なければ「ロールの作成」をクリック
###サービス作成
- https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/clusters に移動
- 作成したクラスタを選択し「サービス」タブの「作成」ボタンをクリック
- 「サービスの設定」画面に移動するので、以下のように設定
設定項目 | 設定内容 |
---|---|
起動タイプ | Fargate |
タスク定義 | 作成したタスク定義:latest |
クラスター | 作成したクラスター |
サービス名 | 任意の名前 |
サービスタイプ | REPLICA |
タスクの数 | 1 |
デプロイメントタイプ | Blue/Greenデプロイメント |
CodeDeployのサービスロール | 作成したCodeDeploy用のサービスロール |
- 「ネットワーク構成」画面の設定
設定項目 | 設定内容 |
---|---|
クラスターVPC | 作成したクラスタ |
サブネット | 作成したサブネット |
セキュリティグループ | 作成したセキュリティグループ |
パブリックIPの自動割り当て | ENABLED |
ヘルスチェック の猶予期間 | 100 |
ロードバランサの種類 | ApplicationLoadBalancer |
ロードバランサ名 | 作成したロードバランサー |
- 「ネットワーク構成」画面の「Blue/Greenデプロイメント」周りの設定
- 「ロードバランス用のコンテナ」で「ロードバランサーに追加」ボタンを押す
- 「プロダクションリスナーポート」「テストリスナーポート」にそれぞれ作成したロードバランサーのポートを割り当て
- 「AdditionalConfiguration」でターゲットグループそれぞれに作成した物を割り当て
- 「サービスの検出の統合の有効化」チェックを外す
- 「次のステップ」をクリック
- 「Auto Scaling (オプション)」画面の設定
- 「ServiceAutoScaling」任意の設定にチェック(投稿した時点ではBlue/Greenデプロイを行う場合はAutoScalingは不可)
- 「確認」画面の設定
- 内容に問題がなければ「サービスの作成」ボタンをクリック