株式会社エコリング

2023.12.05

ECSとECRの環境構築

 

こんにちは。EDX推進部の村上です。

こちらの章にて、ECSとECRの環境構築を行います。

 

前の章はこちら

 

vpcを構築

まず初めに今回の環境を構築するVPCを作成します。

今回はcloud formationを使って、VPC、インターネットゲートウェイ、サブネット等の必要なネットワーク設定を作成します。以下のリンクよりテンプレートファイルを取得してください。

vpcスタック

 

こちらのファイルを解凍後、cloud formationを開き、テンプレートファイルのアップロードから作成を行います。

 

スタック名:eco-line-system

PJPrefix:els

を設定して実行します。

 

 

こちらのファイルを実行すれば、以下の環境が構築されます。

VPC CIDR:10.1.0.0/16

PublicSubnetA CIDR:10.1.10.0/24

PublicSubnetC CIDR:10.1.20.0/24

PrivateSubnetA CIDR:10.1.100.0/24

PrivateSubnetC CIDR:10.1.200.0/24

 

この際にルートテーブル、インターネットゲートウェイの設定もされます

 

 

ECRを設定する

ECRを開き、リポジトリ名を作成を選択します。

リポジトリ名はdockerのimageと同じ「eco-line-system」を設定します。

 

 

リポジトリの作成が終われば、対象のリポジトリ名を選択し、プッシュコマンドの表示を選択します。

 

 

プッシュコマンドに記載された通りにコマンドをwindowsの環境化(コマンドプロンプト)で実行します。

※以降はAWS CLIが必要となります。まだインストールされていない方はインストールしてください。

 

 

 

aws ecr get-login-password --region ap-northeast-1 --profile eco-line-system | docker login --username AWS --password-stdin 752838704519.dkr.ecr.ap-northeast-1.amazonaws.com

 

上記コマンドが上手くいかない場合は

aws configureコマンドでプロファイルを作成し、プロファイルを指定して実行してください。

上記の例はプロファイルを使用し、プロファイルを指定して実行しています。

 

aws_access_key_id

aws_secret_access_key

 

にはIAMのアクセスキーとシークレットキーを設定します。

PUSHコマンドまで正常に終わるとECRのリポジトリにlatestタグのイメージが作成されています。

 

 

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

以降からステージング環境の設定を構築します。

本番環境を作成する際も同様の設定を行っていきます。

 

各種セキュリティグループを順番に作成していきます。

 

セキュリティ名:stg-els-alb-sg

ロードバランサーの設定で使用します

インバウンドルールでHTTP、HTTPSを許可します

 

 

 

セキュリティ名:stg-els-fargate-sg

fargateの設定で使用します

HTTPを選択肢、先ほど作成したロードバランサーのセキュリティグループを指定します。

 

 

 

セキュリティ名:stg-els-rds-sg

RDSで使用します

MYSQL/Auroraを指定し、先ほど作成したfargateのセキュリティグループを指定します。

 

 

ロードバランサの作成

まずはターゲットグループから作成します。

 

 

ターゲットグループの作成

 

下の内容で設定

ターゲットグループ名:stg-els-alb-group

ターゲットタイプの選択:IP アドレス

プロトコル : HTTP

VPC:対象のVPC

ヘルスチェックパス:/healthcheck.html

 

※laravelのpublicフォルダにhealthcheck.htmlを作成しておいてください

 

 

ロードバランサーの作成

 

ロードバランサー名:stg-els-alb

タイプ:Application Load Balancer

ネットワークマッピングはpublicのサブネットを選択します。

セキュリティグループは先ほど作成したロードバランサー用のものを選択します。

ターゲットグループは先ほど作成したものを選択

 

 

 

RDSの作成

laravelで実行したデータをECSからDBへ保存するためにRDSを設定します。

 

エンジン;MYSQL

DBインスタンス識別子:stg-eco-line-system

マスターユーザー名:任意

マスターパスワード:任意

※この後、ECSのタスクの環境変数で設定

 

VPC:作成したVPC

セキュリティグループ:stg-rds-sg

最初のデータベース名:stg_eco_line_sysytem

 

Route53の設定

ドメイン経由でサイトにアクセスできるようにRoute53の設定を行います。

※不要な方はスルーしてください。

 

対象ドメインを選択し、DNSレコードとしてAレコードを追加します。

Aレコードの値にロードバランサーのURIを指定します。

 

 

ECSの作成

 

クラスターの作成

クラスターの作成を選択します。

 

クラスター名:stg_els_cluster

インフラストラクチャ:AWS Fargate (サーバーレス)

 


 

 

タスクの作成

 

クラスター作成後、左メニューの新しいタスク定義を選択します。

タスク名:stg_els_definition

起動タイプ:AWS Fargate

タスクロール:ecsTaskExcuteionRole

タスク実行ロール:ecsTaskExcuteionRole

 

 

コンテナ名:WEBサーバーのコンテナ名を入力します

イメージURI:ECRのリポジトリ(以下画像のイメージURL)

 

 

環境変数

DB_DATABASE:RDSで設定したデータベース名

DB_HOST:RDSで設定したホスト

DB_PASSWORD:DBパスワード

DB_USERNAME:DBユーザー名

 

 

ecsTaskExcuteionRoleのタスクロールを設定した後に、IAMからロールの設定を開き

以下のポリシーを、許可を追加>インラインポリシーの追加からポリシーを追加します。

後でコンテナにexeコマンドで入るためにこの設定が必要になります。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}

 

 

サービスの作成

 

サービス名:stg_els_services

以下のように設定します。セキュリティグループはfargate用で作成したものを設定してください。

 

 

 

 

 

 

サービスの作成が終わるとタスクが実行され、インスタンスが作成されます。

この際にエラーになる場合は、ロードバランサーが正しくヘルスチェックができていない場合があります。

healthcheck.htmlが存在するか、ターゲットグループの設定は正しいかご確認ください。

 

対象のドメインまたはURLを開き、laravelが正常に表示されていれば正しくECSの設定がされています。

 

migrateを実行する

上記のままでは、DBにテーブルがない状態です。

通常であればサーバーにSSHで入り、migrateコマンド実行するのですが、ECSはデフォルトでサーバーに入ることができません。

dockerを使用しているため、サーバーに入るためにはexecute commandを実行する必要がありますが、まずはコマンドを使用できるように設定を行います。

 

コマンドは以下に置き換えて入力してください。

[クラスター名] = 作成したクラスタ名

[サービス名] = 作成したサービス名

[タスク名] = 作成したタスク名

[タスクID] = 作成されたタスクのID(タスク名ではない)

[コンテナ名] = dockerのWEBコンテナ名

 

1.Amazon CLIを開く。画面上部にある一番左のアイコン

 

2.コンソールに以下コマンドを入力する

aws ecs update-service \
--cluster [クラスター名] \
--service [サービス名]  \
--task-definition [タスク名] :1 \
--enable-execute-command

 

上記のコマンドでexecute-commandをONにできます。

コマンドを実行後、ECSの画面に戻りタスクを更新するために、サービスの更新から再度デプロイを実行します。

この際に「新しいデプロイの強制」にチェックをいれて更新してください。

 

 

3.以下コマンドでコマンドがONになったかチェックする

Amazon CLI上で以下コマンドを実行します。

aws ecs describe-services --cluster [クラスター名] --services [サービス名]| jq '.services[].enableExecuteCommand'
aws ecs describe-tasks --cluster [クラスター名] --tasks [タスクID]| jq '.tasks[].enableExecuteCommand'

 

 

上記でtrueが返ってこれば成功です。

 

4.dockerのコンテナに入る

以下コマンドでdockerのコンテナーに入ります。

aws ecs execute-command --cluster [クラスター名] --task [タスクID] --container [コンテナ名] --interactive --command "bash"
752838704519.dkr.ecr.ap-northeast-1.amazonaws.com/eco-line-system:latest

 

5.migrateを実行する

対象のディレクトリ(/var/www/html)へ移動し、migrateコマンドを実行

 

一回設定すれば、1~3の手順は不要となります。

migrate実行後にlaravelでユーザーの作成を行い、ログインできれば成功です。

関連ニュースはこちら

アーカイブ