LoginSignup
0
2

More than 3 years have passed since last update.

Fargate(BGDeploy)+Rails:ECS設定編

Last updated at Posted at 2019-09-30

概要

ECS上でコンテナ化したRailsアプリを動かす
(ダラダラ書いてるので分割予定)

デプロイ設定は以下で
https://qiita.com/kinoshita-yu/items/6d3b07b968ff5810e489

前提

構成

  • rails
  • RDS
  • ECS(Fargate)

構成図

Fargate構成.jpg

VPCの作成

割愛:追記予定

RDSの設定

割愛:追記予定

ELBの設定

BlueとGreen用に2つのポートからのターゲットを受け取るように設定する

ターゲットグループの作成(2つ作成)

  1. https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#TargetGroups: に移動
  2. 「ターゲットグループの作成」をクリック
  3. 「ターゲットグループ名」に任意の名前を設定
  4. 「ターゲットの種類」にIPを設定
  5. 「プロトコル」にHTTPを設定
  6. 「ポート」に3000、3001を設定
  7. 「VPC」に作成したものを設定
  8. 「ヘルスチェックの設定」以下は任意に設定
  9. 「作成」をクリック

ロードバランサの作成

  1. https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers: に移動
  2. 「ロードバランサの作成」をクリックし、「Application Load Balancer」の「作成」をクリック
  3. 「名前」「スキーム」「IPアドレスタイプ」に適切なものを設定
  4. セキュリティーグループの設定
  5. 作成したターゲットグループを設定

ECS:Fargate設定

タスク定義用のポリシー作成

  1. https://console.aws.amazon.com/iam/home?#/policies に移動
  2. 「ポリシーの作成」をクリックし「JSON」タブをクリック
  3. 以下「▶︎タスク定義用ポリシー」のように設定し「ポリシーの確認」をクリック

タスク定義用ポリシー
{
    "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"
            ]
        }
    ]
}


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

  1. https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles に移動
  2. 「ロールの作成」をクリック
  3. 上記で作成したポリシーを設定

タスク定義作成

  1. https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/taskDefinitions に移動
  2. 「新しいタスク定義の作成」をクリックし「FARGATE」を選択
  3. 「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": []
}

クラスタ作成

  1. https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/clusters に移動
  2. 「クラスターの作成」ボタンをクリック
  3. 「クラスターテンプレートの選択」画面で「AWSFargateを使用」を選択し「次のステップ」をクリック
  4. 「クラスターの設定」画面に移動
    1. 「クラスター名」を入力
    2. 「VPCの作成」にチェックを入れない
    3. 「CloudWatchContainerInsights」にチェックを入れる

CodeDeploy用のロール作成

  1. https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles に移動
  2. 「ロールの作成」をクリック
  3. 「AWSサービス」→「CodeDeploy」→「CodeDeploy-ECS」と選択し「次のステップ:アクセス権限」をクリック
  4. 「AWSCodeDeployRoleForECS」ポリシーが表示されていることを確認し「次のステップ:タグ」をクリック
  5. 任意のタグを設定したら「次のステップ:確認」をクリックし、問題なければ「ロールの作成」をクリック

サービス作成

  1. https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/clusters に移動
  2. 作成したクラスタを選択し「サービス」タブの「作成」ボタンをクリック
  3. 「サービスの設定」画面に移動するので、以下のように設定
設定項目 設定内容
起動タイプ Fargate
タスク定義 作成したタスク定義:latest
クラスター 作成したクラスター
サービス名 任意の名前
サービスタイプ REPLICA
タスクの数 1
デプロイメントタイプ Blue/Greenデプロイメント
CodeDeployのサービスロール 作成したCodeDeploy用のサービスロール
  1. 「ネットワーク構成」画面の設定
設定項目 設定内容
クラスターVPC 作成したクラスタ
サブネット 作成したサブネット
セキュリティグループ 作成したセキュリティグループ
パブリックIPの自動割り当て ENABLED
ヘルスチェック の猶予期間 100
ロードバランサの種類 ApplicationLoadBalancer
ロードバランサ名 作成したロードバランサー
  1. 「ネットワーク構成」画面の「Blue/Greenデプロイメント」周りの設定
    1. 「ロードバランス用のコンテナ」で「ロードバランサーに追加」ボタンを押す
    2. 「プロダクションリスナーポート」「テストリスナーポート」にそれぞれ作成したロードバランサーのポートを割り当て
    3. 「AdditionalConfiguration」でターゲットグループそれぞれに作成した物を割り当て
    4. 「サービスの検出の統合の有効化」チェックを外す
    5. 「次のステップ」をクリック
  2. 「Auto Scaling (オプション)」画面の設定
    1. 「ServiceAutoScaling」任意の設定にチェック(投稿した時点ではBlue/Greenデプロイを行う場合はAutoScalingは不可)
  3. 「確認」画面の設定
    1. 内容に問題がなければ「サービスの作成」ボタンをクリック
0
2
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
2