2023.12.05
ECSとECRの環境構築
こんにちは。EDX推進部の村上です。
こちらの章にて、ECSとECRの環境構築を行います。
前の章はこちら
目次
vpcを構築
まず初めに今回の環境を構築するVPCを作成します。
今回はcloud formationを使って、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でユーザーの作成を行い、ログインできれば成功です。
関連ニュースはこちら
-
2023/12/05
-
2023/12/05
-
2023/12/05