ECSでNginxを動かす第一歩:コンテナ化の基礎からデプロイまで

AWS

こんにちは!最近はできるかわからないですが、毎日1投稿を目指して頑張ってます!三日坊主にならないように頑張りたいと思います。

さて、最近EC2 は使い慣れているけれども、ECS は全然だめだなっていうところで、アウトプットがてら、ECS でnginx だけ立てていこうと思います。とりあえず今回はnginx だけですが、次からはnginx php-fpm の連携とか、ALB も立ててちゃんとした環境も作っていけたらいいなと思っています。

今回のゴール

nginx でなんらかの画面が表示されることを目標とします。nginx の初期ページが表示される形でも大丈夫とします。

今回の構成図

簡易になってしまいますが、今回試した構成図も書いておきます。

元のファイル自体は、github で管理します。流れは以下になります。

① github のmain branch にpush

②code pipeline が走って、ECR にデプロイされる

③ ECS に手動でECR のタスクなどを更新

④ サービスインを手動で実施

ECR に対して、イメージを更新する以降は手動対応になってはいますが、それまでの工程は自動で実施という形でやっていこうと思います。

なので、大元のファイルをまず紹介しようと思います。

nginx のDockerfile 作成

今回使用するファイルはこの2つになります

.
├── Dockerfile
└── nginx.conf

今回はnginx のECS に対してデプロイすることが目的なので、最小単位の設定にしています。

Dockerfile

FROM nginx:stable-alpine

COPY ./nginx.conf /etc/nginx/nginx.conf

nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

コピペは事故のもとなので、使用したい場合は下記のレポジトリをclone してください。

GitHub - kentaindeed/ecr-build-test
Contribute to kentaindeed/ecr-build-test development by creating an account on GitHub.

次にインフラ環境の構築にいきます。まずはcode pipeline を作成していきます

Code pipeline の作成

作成オプション

これまで、buildspec.yml 書いていたものがなくなったので、ECR にプッシュを選択するだけでよくなりました。

ソースを選択

codeCommit はなくなったのかな?Github など自分が使っているものを選択します。一回目は認証が必要なので、Github に接続するなどを押して、認証を進めてください。接続できたら、レポジトリ名なども出てきますので、それぞれ対象にしたいものを選択してください。

テンプレート設定

build するDockerfile などがどこに配置されているのかを指定するパラメータです。基本的にroot ディレクトリかと思いますが、そうではない場合はこの値を調整してください。

create pipeline from template を押すとデプロイがはじまります。

pipeline が成功していたら、問題なくECR が作成されていると思います。pipeline のステータスとECR が上で指定した名前で作成されていることをそれぞれ確認してみてください。

では、ここまでで準備ができたので、ECS を作成していきましょう!

ECS の作成

ECS の作成の手順・・・

① クラスターの作成

② タスク定義の作成

③ クラスターの中の設定

になります。

クラスターの作成

まずは、クラスターを作成していきましょう。

基本、クラスター名称とFargate かEC2 を選択して、作成を押します。裏でCloudformation が走って作成されます。

タスク定義の作成

タスク定義を作成していきましょう。まずは、名前とスペックを設定します。ただ、今回はテストなので、そのままデフォルトでいきます。

次に、タスクロールを指定していきます。今まで作成したことがない人は、新しいロールを作成を押すと、おそらくデフォルトの設定で作成してくれます。あとは、コンテナの設定で、イメージURI をECR のイメージURI からコピペしてください。

他に関しては、デフォルトで作成しますので、今回はこれで作成してください。

クラスター内の設定

クラスター内の設定をしていきます。大きく二つの設定をします。

  • タスクの設定
  • サービスの設定 (タスクの設定と同じなので、割愛します)

タスクの設定からしていきます。先ほど作成した、タスク定義を指定してください。

環境はデフォルトのままでいくので、ネットワーキングの設定に進んでください。

VPC を作成していない方は、新しいVPC の作成をしてください。

  • VPC (自分で作成したVPC)
  • サブネット( public subnet が好ましいです. 簡単なので)
  • セキュリティグループ (HTTP 80 port であけてください)
  • パブリックIP はオンにしてください

ここまで設定できたら、作成を押下してください。

次にサービスの作成をするのですが、タスクと全く同じなので、割愛します。

ここまできたら、public IP をブラウザで叩いて、nginx の画面が表示されるか確認してください。

http://<your-public-ip>

片付け

ECS が実行されているとお金がとられるので、ECS のタスクとサービスを削除するのを忘れないで下さい。実行中のタスクを停止して、サービスを強制終了させたらとりあえずは料金はそんなに発生しなくなるかとおもいます。気になる方は、ECR だったりpipeline なども削除するといいかと思います。

まとめ

今回はECS でnginx だけのデプロイでしたが、他のミドルウェアなどのコンテナも関連してくるとややこしくなりそうなので、その辺りもチャレンジしていきます。

参考

ECRへのPushでECSをデプロイするだけのシンプルなCodePipelineを試す | DevelopersIO
ECSのタスクロールとタスク実行ロールの違い
ECS を利用すると「タスクロール」と「タスク実行ロール」というものが出てきます。名前が似ている上に、どのように設定する ...

コメント

タイトルとURLをコピーしました