4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ECS/Fargateに入門してみた

Posted at

作成するアーキテクチャ

ECS:Fargate.png

Dockerを本番環境で使うメリット

  • エラーの発生を抑えられる。(ローカル環境や本番環境の差分を減らせるため、環境由来のエラーを防げる。)
  • 環境構築のコストを下げられる。(docker build, docker runで一発で立ち上がる。)
  • コードで管理できるため属人性を排除できる。(ファイルを管理すれば、コマンドで操作できるため誰がやっても同じ結果になる。)
  • コードで管理できるためGitと併用できる。(Git,GitHubと連携してver管理ができる。)

Docker基本コマンド

①docker run

docker imageからコンテナを一つ起動する。

②docker build

Dockerfileからイメージを作成。

③docker exec

コンテナ内のコマンドラインにアクセスする。

AWS側の操作

マネジメントコンソールにアクセスした後下記の操作を行う。

①ユーザ作成

rootユーザをそのまま使っていてはセキュリティ上まずいため別にユーザを作成する。

スクリーンショット 2022-05-15 2.56.55.png

IAMを起動した後左側にある「ユーザー」を選択。

スクリーンショット 2022-05-15 3.03.16.png

右上のボタン「ユーザーを追加」をクリック。

スクリーンショット 2022-05-15 3.08.37.png

ユーザ名: yoshizumiadmin #(笑)
AWS 認証情報タイプを選択: アクセスキー、パスワード両方にチェックを入れる
コンソールのパスワード: *******
パスワードのリセットが必要: チェックを外す

スクリーンショット 2022-05-15 3.18.41.png

AdministratorAccessを付与して

スクリーンショット 2022-05-15 3.21.33.png

ここまでできたら作成する。

スクリーンショット 2022-05-15 3.23.37.png

csvをダウンロードしてIAMユーザの作成は完了。
以降はこのユーザを使用してマネジメントコンソールにログインする。

$ aws configure

AWS Access Key ID [******************NW]: 
AWS Secret Access Key [******************XF]: 
Default region name [ap-northeast-1]:
Default output format [None]: json

上記のように設定してAWS-CLIの設定を終える。

②ECSロール作成

他のAWSサービスと連携するためにもECSにIAMロールを割り当てる。
ECS関連の3つのロールを作成する。
スクリーンショット 2022-05-15 9.53.58.png

左のタブから「ロール」を選択。

スクリーンショット 2022-05-15 16.43.18.png
画像のような具合に3つ作成していく。

②つ目のロール
スクリーンショット 2022-05-15 16.49.14.png

③つ目のロール
スクリーンショット 2022-05-15 18.14.07.png

「task」で検索をかけて、ポリシーを絞ることを忘れない。
3つロールを作成したら、この手順は完了。

③VPCの作成

ECS:appdb.png
作成するVPCのイメージ

スクリーンショット 2022-05-15 23.08.15.png
マネジメントコンソールからサービス検索⇨「VPC」を検索⇨「VPCを作成」
名前:ecs-vpc
IP v4CIDR:10.0.0.0/16
あとはデフォルトで作成。この中にパブリックサブネットを二つ作成する。(DBをプライベートサブネットに作成しないのは、あくまで練習用のため)

public-subnet1:AZ-1a,CIDR:10.0.0.1/24
public-subnet2:AZ-1c,CIDR:10.0.1.0/24
あとはデフォルトでサブネットを2つ作成する。
(書き忘れてたけど、インターネットゲートウェイも作成してください!笑)

スクリーンショット 2022-05-15 23.26.20.png
ルートテーブルをIGW向けに作成してインターネットとの通信を可能にする。
先ほど作成したサブネットとの関連付けをしてこの手順を完了する。

④ECRにDockerfileをアップロード

アップロードするDockerfile

FROM php:7.4.24-apache

# PHPのモジュールなどをインストール
RUN apt-get update \
  && apt-get install -y zlib1g-dev \
  && apt-get install -y zip unzip \
  && apt-get -y install libzip-dev libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli zip \
  && docker-php-ext-enable pdo_mysql mysqli \
  && a2enmod rewrite

# タイムゾーン設定
ENV TZ=Asia/Tokyo

# cronのインストール
RUN apt-get update && apt-get install -y \
  busybox-static \
  && apt-get clean

# composerをインストール
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

# アプリケーションフォルダを環境変数として設定
ENV APP_HOME /var/www/html

# apacheのuidとgidをdocker user uid/gidに変更。
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

#change the web_root to laravel /var/www/html/public folder
# RUN sed -i -e "s/html/html\/public/g" /etc/apache2/sites-enabled/000-default.conf
COPY ./php/vhost.conf /etc/apache2/conf-enabled/vhost.conf

#  apache module rewrite を有効にする
RUN a2enmod rewrite

# ソースコードと.envファイルをDockerImageに埋め込む
COPY . $APP_HOME
COPY .env.production /var/www/html/.env
# 初回起動時に行うスクリプトファイルをコピーして実行権限を与える
COPY ./php/start.sh /var/www/html/start.sh
RUN chmod 744 ./php/start.sh

# 必ずキャッシュ用のディレクトリを作っておくこと→ Fargateの場合ずっとキャッシュが残ることになる
RUN mkdir bootstrap/sessions && \
    mkdir storage/framework/cache/data

# フレームワークに必要なモジュールをDockerImageにインストール
RUN composer install --no-dev --no-interaction

# 書き込み権限を与える
RUN chown -R www-data:www-data $APP_HOME
# RUN chmod -R 777 storage && \
#     chmod -R 777 bootstrap
# CMD php artisan migrate --force
CMD ["bash", "start.sh"]

※細かいDockerfileの解説は省きます。

DBのDockerfileも作成しておく。

FROM mysql:5.7.30

COPY ./init.sql /docker-entrypoint-initdb.d

※シェルスクリプトを書いてbuildの際に走らせる。

start.sh
#!/usr/bin/env bash
php artisan migrate --force
chmod -R 777 bootstrap 
chmod -R 777 storage
/usr/sbin/apache2ctl -D FOREGROUND

マネジメントコンソールからECSを検索し、右側のタブからリポジトリを選択
スクリーンショット 2022-05-16 0.31.15.png

スクリーンショット 2022-05-16 0.35.30.png

プライベートのlaravel-ecsというリポジトリを作成する。
イメージスキャンの設定を有効にしておくことを忘れない。
リポジトリを作成する。

スクリーンショット 2022-05-16 0.44.19.png
右上の「プッシュコマンドを表示」で表示されたコマンドをターミナルから実行する。

スクリーンショット 2022-05-16 0.43.19.png
無事ログインできたことが分かる。

先ほど作成したDockerfileがあるディレクトリに移動したあと、ECR「プッシュコマンドの表示」で表示されるコマンドを順に実行していく。

①aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com

②docker build -t laravel-ecs .
スクリーンショット 2022-05-19 21.33.01.png
うまくbuildできている。

③docker tag laravel-ecs:latest 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/laravel-ecs:latest
tag付けをしている。

④docker push 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/laravel-ecs:latest

スクリーンショット 2022-05-19 21.54.59.png
無事pushされていることがわかる。
同様にしてDBのリポジトリを作成していく。

スクリーンショット 2022-05-19 23.49.30.png
名前だけ変えて作成する。
次は同様にしてイメージをプッシュしていく。

①aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com

②docker build -t mysqlecs .
スクリーンショット 2022-05-19 23.59.14.png
今度はすぐbuildされる。

③docker tag mysqlecs:latest 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/mysqlecs:latest

④docker push 071667546372.dkr.ecr.ap-northeast-1.amazonaws.com/mysqlecs:latest
スクリーンショット 2022-05-20 0.07.51.png
こちらも無事pushできた。

Fargateの操作

※ローカルにDockerのインストールが済んでいない場合はインストールする。

①クラスター作成
スクリーンショット 2022-05-20 0.16.35.png
マネジメントコンソールからECSを開き、「クラスター」⇨「クラスターの作成」をクリック。

スクリーンショット 2022-05-20 0.18.32.png
「ネットワーキングのみ」を選択。

スクリーンショット 2022-05-20 0.21.06.png
クラスター名をつけてクラスター作成。

スクリーンショット 2022-05-20 0.31.43.png
無事に作成されている。

②タスク定義

スクリーンショット 2022-05-20 1.12.15.png
左側のタブから「タスク定義」を選択。
「新しいタスク定義の作成」⇨「起動タイプの互換性の選択」:Fargateを選択して次のステップ。

スクリーンショット 2022-05-20 1.19.17.png
タスク定義名:simpleapp
タスクロール:AmazonECSTaskExecutionRole
オペレーティングシステムファミリー:Linux
タスクメモリ (GB):0.5GB
タスク CPU (vCPU):0.25vCPU
「コンテナの追加」⇨コンテナ名:laravel⇨イメージ:先ほど作成したECRのリポジトリURI
メモリ制限 (MiB):128
ポートマッピング:80

あとはデフォルトで「作成」

スクリーンショット 2022-05-20 1.29.48.png
作成には成功している。

③サービス作成
スクリーンショット 2022-05-20 1.34.21.png

起動タイプ:FARGATE
オペレーティングシステムファミリー:Linux
リビジョン:latest
プラットフォームのバージョン:LATEST
クラスター:simple-ecs
サービス名:simple-ecs-service
タスクの数:1
デプロイメントタイプ:ローリングアップデート
あとはデフォルトで「次のステップ」

クラスター VPC:先ほど作成したVPC
サブネット:先ほど作成したサブネット2つ

あとはデフォルトで「次のステップ」
Autoscaling:何も変更せずに「次のステップ」

スクリーンショット 2022-05-20 1.57.19.png
無事作成されている。

スクリーンショット 2022-05-20 2.02.29.png
パブリックIPからアクセスを試みる。

スクリーンショット 2022-05-20 2.00.04.png
エラーが表示される。なんでだ!

スクリーンショット 2022-05-20 2.40.21.png

DBとうまく接続できていませんでしたね。これで完了です!!

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?