Closed4

Laravel + nginxをFargateにデプロイするまでの記録

shiva_itshiva_it

■以下ドキュメントを実施し、理解を深める
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/getting-started-fargate.html

■以下の記事を参考に、上記で作ったECRイメージをサービスとしてデプロイ実施し、Hello worldされることを確認。
https://zenn.dev/hibriiiiidge/books/49ee4063b10cec1df1a2/viewer/1ad93b

shiva_itshiva_it

更にこちらの記事を実践し、nginxコンテナデプロイ + index.htmlの中身を書き換えるところまで完了
https://qiita.com/kohatang/items/99deeddf0e40d69c9fc4
以下の手順により、nginxのhtmlファイル群を変更しデプロイ実施。

  1. Dockerfileと同じパスにファイル追加
  2. Dockerfile編集保存(COPYコマンドでコンテナにファイルコピー)
  3. ビルド実施
    docker build -t nginx-test .
  4. docker runしてローカルで動作確認
    docker run -itdp 80:80 nginx-test
  5. docker tag実施
    docker tag nginx-test:latest [account_number].dkr.ecr.ap-northeast-1.amazonaws.com/index:[通番]
  6. docker push実施
    docker push 845660134338.dkr.ecr.ap-northeast-1.amazonaws.com/index:[通番]
  7. AWSコンソールでECS>タスク定義>タスク定義名にチェックを入れて「新しいリビジョンの作成」
  8. コンテナ名>イメージで通番変更し保存
  9. ECS>クラスター>サービスでサービス名にチェックを入れて「更新」
  10. タスク定義>リビジョンで最新の通番を選択し更新実施
  11. ALBのDNSから飛んで変更反映されていることを確認する

nginxにログインしたい時は
docker exec -it [container_name] /bin/sh

shiva_itshiva_it

プライベートサブネットにFargate配置

最終目標

コンテナ周りは上記電子書籍、ネットワーク周りはこちらの記事を参考にやってみる
https://nishinatoshiharu.com/alb-fargate-privatelink/

1. ネットワーク構築

まずこれを目指す!

  • VPC作成
    10.0.0.0/16のVPCを作成

  • サブネット作成
     以下のサブネットを作成

    名称 IP AZ
    public-1a 10.0.0.0/24 1a
    private-1a 10.0.1.0/24 1a
    public-1c 10.0.2.0/24 1c
    private-1c 10.0.3.0/24 1c
  • IGW作成
    作成後VPCをアタッチ

  • パブリックサブネット用ルートテーブル作成し、public-1a及びpublic-1cに割り当て

    送信先 ターゲット
    0.0.0.0 IGWのID
  • セキュリティグループ作成
    ALB用とFargate用でそれぞれ作成

    名称 タイプ ソース
    ALB-sg HTTP、HTTPS 任意の場所
    Fargate-sg HTTP ALB-sg
  • ALB構築

    項目 設定内容
    サブネット public-1a, public-1c
    セキュリティグループ ALB-sg
    ターゲットの種類 IP
    プロトコル HTTP

ここまでで一旦パブリックサブネットに踏み台用EC2、プライベートサブネットにWebサーバ用EC2を設置し、ALBのDNSからWebアクセスできることを確認

2. PrivateLink構築

次はこれ

プライベートサブネット内のコンテナについて、インターネットからのWebアクセスはALBのみでOKだが、ECRからイメージをPullするには、コンテナからAWSリソースへアクセスするための別口が必要となる。そのためにPrivateLinkをVPCに設定。
プライベートサブネットにfargateを配置する場合では以下のエンドポイントが必要

エンドポイント名 用途
ecr.dkr ECR通信用
ecr.api ECR通信用 ※
s3 s3通信用(docker imageの実態がS3に保存されているため)
logs CloudWatch用

※ecr.apiについてはこちらを参照
https://qiita.com/fujisawatk/items/0b5c587c41414ed1cc42
※他にParameterStoreやSecretsMnagerから情報を取得する必要がある場合は別途VPCエンドポイントを設ける必要がある。こちらを参照。
https://zenn.dev/yoshinori_satoh/articles/ecs-fargate-vpc-endpoint
今回はParameterStoreから環境変数を取得したいのでssmエンドポイントも準備します。

  • PrivateLink用のセキュリティグループを作成
    Fargateを設置するPrivateSubnetからのHTTPSアクセスを許可(インバウンド)
  • VPC>エンドポイント>エンドポイントの作成から、上記4つのエンドポイントを作成する。
    ※ssmエンドポイントも作るので合計5つ
    ecr.dkr s3 logs
    サービスカテゴリ AWSサービス AWSサービス AWSサービス
    サービス名 com.amazonaws.ap-northeast-1.ecr.dkr com.amazonaws.ap-northeast-1.s3 com.amazonaws.ap-northeast-1.logs
    タイプ Interface Gateway Interface
    VPC 作ったやつ 作ったやつ 作ったやつ
    サブネット private-1a, private-1c - private-1a, private-1c
    ルートテーブル - private-1a, private-1c -
    プライベートDNS名有効 ON - ON
    セキュリティグループ Link用に作ったやつ - Link用に作ったやつ

3. ECR作成

これを元に実施 https://zenn.dev/shivashi/scraps/cedf3d71405cca#comment-34b22c56bb53d7

4. クラスタ作成

『ネットワーキングのみ』を選択し、作成実施。

5. タスク定義

例によりこちらを参考に作成。 https://zenn.dev/shivashi/scraps/cedf3d71405cca#comment-34b22c56bb53d7
jsonファイルからCLIでタスク定義を展開するやり方だが、"image"、"awslogs-group"の名前を実際のものに合わせて変更する(この時にCloudWatchのロググループやParameterStoreの準備がまだな場合、タスク定義コマンド実行前のこのタイミングでもろもろ作っておきます。)

6. サービスの作成

こちらも例の神電子書籍を、、!!
サービス名、VPC、サブネット、LoadBalancerあたりを自分で作ったやつに合わせる。
タスクの数、最小ヘルス率、最大率はデフォルトで(これで常時2タスク、最大4タスクになる)

7.動作確認

ALBのDNS名からアクセス!

このスクラップは2021/04/27にクローズされました