Closed9

ECSにデプロイできるようにDocker環境を構築する

NojiraNojira

localで起動するdocker-compose.ymlを作成

  • nginx
  • php-fpm

  • Laravelソースをそれぞれコピー
  • Laravelルートにdocker-compose.ymlを配置。
  • Dockerfileなどは Laravelルートの_dockerフォルダへ。
  • DockerfileからLaravelソースを操作できるようにcontext設定
docker-compose.yml
services:
  nginx:
    build: 
      context: ./

ここまでのyml

docker-compose.yml
version: "3.9"
services:
  nginx:
    build: 
      context: ./
      dockerfile: ./_docker/nginx/Dockerfile
    ports:
      - "80:80"
  php-fpm:
    build: 
      context: ./
      dockerfile: ./_docker/php-fpm/Dockerfile
NojiraNojira

imageを作成し動作確認

nginxのイメージを作成

# docker build -t [イメージ名] [イメージを作成する時に参照するディレクトリ] -f [dockerfileの指定] 
 docker build -t nojira-nginx . -f _docker/nginx/Dockerfile

docker-compose.ymlのimageを指定

docker-compose.yml
version: "3.9"
services:
  nginx:
    image: nojira-nginx
    ports:
      - "80:80"

起動確認

docker compose build --no-cache
docker compose up -d

php-fpmのイメージを作成

# docker build -t [イメージ名] [イメージを作成する時に参照するディレクトリ] -f [dockerfileの指定] 
 docker build -t nojira-php-fpm . -f _docker/php-fpm/Dockerfile

docker-compose.ymlのimageを指定

docker-compose.yml
version: "3.9"
services:
  php-fpm:
    image: nojira-php-fpm

起動確認

docker compose build --no-cache
docker compose up -d

ここまでのdocker-compose.yml

docker-compose.yml
version: "3.9"
services:
  nginx:
    image: nojira-nginx
    ports:
      - "80:80"
  php-fpm:
    image: nojira-php-fpm
NojiraNojira

ECRにpush

# aws cli プロフィール変更
less ~/.aws/credentials 
export AWS_DEFAULT_PROFILE=nojira

# とりあえずアカウントあっているか見ておく
aws s3 ls

# ECRログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <accountId>.dkr.ecr.ap-northeast-1.amazonaws.com

# ECRログアウト(作業完了時に忘れずに)
docker logout <accountId>.dkr.ecr.ap-northeast-1.amazonaws.com

ECRリポジトリを作成 nginx用とphp-fpm用
https://docs.aws.amazon.com/cli/latest/reference/ecr-public/create-repository.html


# aws ecr create-repository --repository-name <リポジトリ名> --region <リージョン>
aws ecr create-repository --repository-name nojira/nginx --region ap-northeast-1 
aws ecr create-repository --repository-name nojira/php-fpm --region ap-northeast-1 

ローカルのimageにECRリポジトリのタグをつける

docker tag nojira-nginx:latest <accountId>.dkr.ecr.ap-northeast-1.amazonaws.com/nojira/nginx:latest
docker tag nojira-php-fpm:latest <accountId>.dkr.ecr.ap-northeast-1.amazonaws.com/nojira/php-fpm:latest

ECRにpushされていることを確認

aws ecr list-images --repository-name nojira/nginx --region ap-northeast-1 
aws ecr list-images --repository-name nojira/php-fpm --region ap-northeast-1 
NojiraNojira

ECS設定

タスク定義を作成

  • EC2
  • コンテナの追加
    • コンテナ名:nginx

      • イメージ:nojira/nginx ECRのリポジトリのURI
      • メモリ制限 : 適宜(128)
      • ポートマッピング: 80:80
      • (php-fpmコンテナ追加後)スタートアップ依存順序 :  php-fpm START
      • (php-fpmコンテナ追加後)ネットワーキングの設定 > リンク : php-fpm:php-fpm
    • コンテナ名:php-fpm

      • イメージ:nojira/php-fpm ECRのリポジトリのURI
      • メモリ制限 : 適宜(128)

クラスターを作成

  • EC2 Linux + ネットワーキング
  • クラスター名:nojira-cluster
  • インスタンスタイプを選択 (t3.micro)

サービスを作成

  • EC2
  • タスク定義:nojira-task
  • クラスター:nojira-cluster
  • サービス名:nojira-service
  • タスクの数:1

動作確認

サービス > タスクのステータスがRUNNINGになったら
EC2 インスタンスのパブリック IPv4 アドレスにアクセス
Laravel画面が表示される

NojiraNojira

ECSにALBを追加する

https://aws.amazon.com/jp/premiumsupport/knowledge-center/create-alb-auto-register/
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/create-application-load-balancer.html

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

  • ターゲットタイプ:インスタンス
  • VPCをECSクラスターに合わせる

ALBを作成

  • ターゲットグループを紐付ける

タスク定義の新しいリビジョンを作成

  • nginxコンテナのポートマッピングを変更
    設定なし:80

ECSのサービスを作成

  • ロードバランシング:Application Load Balancer
  • 作成したALBを選択
  • ロードバランス用のコンテナ:nginx:0:80 を追加
  • ターゲットグループ名:作成したターゲットグループ選択

EC2インスタンスのセキュリティグループ修正

  • インバウンドルールにALBのセキュリティグループからの全てのトラフィックを追加

ELBのDNSで動作確認

SSL対応

  • ACMを設定
  • ALBのセキュリティグループにHTTPS追加
  • ALBリスナーにHTTPS追加 ターゲットグループに向ける
  • ALBリスナーのHTTPをHTTPSにリダイレクト
  • Route53のホストからALB参照

ドメインで動作確認

  • HTTP・HTTPS両方
NojiraNojira

DB接続する

RDSを作成

  • Aurora(MySQL互換)
  • パブリックアクセスなし
  • セキュリティグループはECSインスタンスのセキュリティーグループからの3306インバウンドのみ
  • 初期データベース作成しておく

ECSインスタンスのセキュリティーグループで

  • インバウンド 22ポート マイIP
  • アウトバウンド3306 RDSセキュリティグループ

ECSクラスターを再作成

  • インスタンスにSSH接続可能にする

ローカルからSSH経由で接続確認

(EC2から接続確認)

EC2にSSH接続

sudo yum update
sudo yum install mysql
mysql -h <RDSエンドポイント> -u <DBユーザー> -p

php-fpmコンテナから接続確認

docker ps
docker exec -it <php-fpmのコンテナID> bash

コンテナ内でlaravelのmigrationコマンド実行

php artisan migrate:status
php artisan migrate
NojiraNojira

ネットワークの設定は先にすべき。

ECSクラスター作成時にVPCなどを新規作成すると、ECSのcloudformationにも記述されるため、ECS削除時にエラーになる。。

NojiraNojira

VPC作成

IP CIDR ブロック:10.0.0.0/16
パブリックサブネット:
ルートテーブル/ネットワーク ACLが作成される

サブネットを2つ作成

Subnet1
VPC 上記で作成したVPCを選択する
AZ :ap-northeast-1a
CIDR 10.0.0.0/24
パブリックIP自動割り当て:はい

Subnet2
AZ :ap-northeast-1c
10.0.1.0/24
パブリックIP自動割り当て:はい

インターネットゲートウェイ追加

作成後、VPCにアタッチ

ルートテーブル

ルールを編集から
0.0.0.0/0  インターネットゲートウェイ検索

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

  • sg-alb用
    インバウンド 80/443
    アウトバウンド 全てのトラフィック
  • sg-ecs用
    インバウンド 80/22
    アウトバウンド 3306(sg-db)
    -sg-db
    インバウンド3306(sg-ecs)
このスクラップは2021/12/12にクローズされました