LoginSignup
5
9

More than 3 years have passed since last update.

【ECS】nginxとphp-fpmが連携したコンテナをECSで動かす

Last updated at Posted at 2020-08-06

概要

ECS及びECRでコンテナを動かす
ころころUIが変わるので文字ベースで必要な作業をメモ

ゴール

下記で作ったコンテナイメージをECSで動かしphpinfoが見られる
LBは通さずインスタンス直通
https://qiita.com/chanP_yamazaki/items/1397f4899f7768c1ed60

プッシュ元のEC2インスタンスにECRへのアクセス権限を付与

・「AmazonEC2ContainerRegistryFullAccess」ポリシーがアタッチされたIAMRoleを設定する

ECRのリポジトリを作る

・Amazon Container Service -> Amazon ECR -> Repositories へ
・リポジトリを作成
 名前は任意

ECRへコンテナイメージをプッシュする

・先ほど作成したリポジトリをクリック
・プッシュコマンドの表示をクリック
・手順1の「認証トークンを取得し、レジストリに対して Docker クライアントを認証します。」のコマンドをコピーして実行

手順1
$ aws ecr get-login-password --region リージョン | docker login --username AWS --password-stdin アカウントID.dkr.ecr.リージョン.amazonaws.com

※ get-login-passwordはaws-cliのv1.17.10以降でないと実行できません
その場合は下記
$ aws ecr get-login --region リージョン --no-include-email
 ↑で出力された物をコピーして実行
$ docker login -u AWS -p XXXXXXX https://アカウントID.dkr.ecr.リージョン.amazonaws.com

・手順2は既にイメージをビルド済みであればスキップ

・手順3でビルド済みのコンテナイメージ名を確認してタグを付ける
 これをnginxとphp-fpmそれぞれで実施

手順3
$ docker images
$ docker tag コンテナイメージ名:latest アカウントID.dkr.ecr.リージョン.amazonaws.com/リポジトリ名:プッシュする際のイメージ名
例: docker tag project_nginx:latest アカウントID.dkr.ecr.リージョン.amazonaws.com/test:nginx

$ docker images
プッシュしたいコンテナイメージにecr用のタグがついていればOK

・手順4でタグ付したコンテナイメージをECRへプッシュ
※dockerバージョン20系から、タグ無しでのpushはlatest指定になります。オプションで--all-tags指定になります
https://docs.docker.com/engine/reference/commandline/push/

手順4
$ docker push アカウントID.dkr.ecr.リージョン.amazonaws.com/test

一つずつも指定可能
$ docker push アカウントID.dkr.ecr.リージョン.amazonaws.com/test:php-fpm
$ docker push アカウントID.dkr.ecr.リージョン.amazonaws.com/test:nginx

・プッシュ後の確認とお掃除
ECRを確認してプッシュしたイメージが一覧に出てくるかを確認
下記コマンドでECRからログアウト
※なにもしなければ12時間でログアウトするけど不要ならログアウトした方が安全

$ docker logout アカウントID.dkr.ecr.リージョン.amazonaws.com

ECSで行う作業の全体像を把握

・タスク定義
 docker-compose.ymlに相当する設定
 これをGUIで設定していくイメージ

・ECSクラスター作成
 ECS経由で立ち上げるEC2インスタンスに関する設定

・ECSクラスター -> サービス作成
 クラスターで立ち上げたEC2インスタンスに対して、どのタスクをどのように配置するかを設定する

ECSのタスクを定義する

※記載がないパラメータは変更しないものとする

・タスク名をつける
 後から変えられないので注意
・コンテナの追加
 これがまさにdocker-compose.ymlに相当している
 ▼ nginx

名称 設定値
コンテナ名 nginx
イメージ ECRにプッシュしたnginxコンテナの「イメージのURI」をコピーして貼り付け
メモリ制限 必要な分だけ設定。全コンテナの合計値がインスタンスのメモリサイズを超えないように注意
ポートマッピング 今回はLBを通さない & httpアクセスなので80:80を設定
スタートアップ依存順序 depends_on設定。コンテナ名「php-fpm」、状態「START」を設定
ネットワーク設定 リンクに「php-fpm:php-fpm」を設定
ストレージとログ ログ設定の「Auto-configure CloudWatch Logs」をONに (立ち上げに失敗した際にログを追えるようになる

 他は最小構成では設定不要

 ▼ php-fpm

名称 設定値
コンテナ名 php-fpm
イメージ ECRにプッシュしたphp-fpmコンテナの「イメージのURI」をコピーして貼り付け
メモリ制限 必要な分だけ設定。全コンテナの合計値がインスタンスのメモリサイズを超えないように注意
ポートマッピング php-fpmは外に開ける必要無いので設定不要
ストレージとログ ログ設定の「Auto-configure CloudWatch Logs」をONに (立ち上げに失敗した際にログを追えるようになる

 他は最小構成では設定不要

・他は設定せず作成

ECSクラスターを作成する

・Amazon Container Service -> Amazon ECS -> クラスター へ
・クラスターの作成

ステップ 名称 設定値
クラスターテンプレートの選択 クラスターテンプレートの選択 EC2 Linux + ネットワーキング
クラスターの設定 クラスター名 test-cluster
インスタンスの設定各種 インスタンスタイプや数は必要に応じて
AmiId 特に理由がなければ今は 「AmazonLinux2」
キーペア コンテナの思想上、インスタンスに入って何かを操作する必要はないので 「なし」 
ネットワーキング vpc、サブネットは必要に応じた設定を
ネットワーキング - セキュリティグループ ポートは80を開ける。IPは必要なものを
Auto assign public IP Use Subnet setting

・作成実行
 実行したクラスターの「ECSインスタンス」タブで、指定した個数のインスタンスが立ち上がり、ステータスがACTIVEになったことを確認

コンテナを立ち上げる

・サービスタブを開いて「作成」

ステップ 名称 設定値
サービスの設定 起動タイプ EC2
タスク定義 ファミリー 先ほど「タスク定義」で作ったタスクを指定
タスク定義 リビジョン latest(最新バージョン)を指定
クラスター test-cluster
サービス名 適当に
サービスタイプ REPLICA (DAEMONだとどう変わるか後で調査
タスク数 1
ネットワーク構成 LBを通す場合はここで設定。今回は何も設定せず次へ
Auto Scalingオプション EC2インスタンスの数をAutoScalingさせたいならここで設定。今回は何も設定せず次へ

・サービスの作成
・作成したサービスのタスクタブにRUNNINGのタスクが出来あがれば成功
・EC2のpublicIPかDNS名にアクセスしてphpinfoが確認できればOK!

5
9
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
5
9