Cloud9で作成したDjangoをコンテナイメージ化してECRにpushする

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

前回Cloud9(Django) + S3 + SQS + Lambda + SNSの環境を構築し、Djangoで作成したWebアプリケーションを経由してS3にデータをアップロードすると、SNSで登録しているメールアドレスに通知が飛ぶ環境を作成しました。

環境は以下のようなイメージです。
![aws-django01-ページ6.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/426843a2-5d28-7283-96dc-22fb1cbe3e34.png)

この環境の構築手順は以下となります。[1]から順番に見て頂ければ同じ環境を作れるはずです。

https://qiita.com/ohtsuka-shota/items/db74a418dabc261d9126

今回はCloud9で作ったDjango環境をコンテナイメージに変換し、それをECRにpushしていきたいと思います。
この次の記事でECRにpushしたイメージを使ってECSにコンテナとしてアプリケーションをデプロイしていきます。

![aws-django01-ページ7.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/fb1de0b7-04d5-e2e1-7c24-2e1446554b80.png)


# 構築
## Cloud9でコンテナイメージを作成する
Cloud9に入り、以下のコマンドをTerminalで実行します。最後のdocker psコマンドで出力があることを確認してください。
OSがAmazon Linux2023であれば最初からdockerが入っているはずですので、本来であればこの手順は不要ですが、一応残しておきます。
```
sudo dnf update -y
sudo dnf install -y docker
sudo systemctl start docker 
sudo systemctl enable docker 
sudo usermod -a -G docker ec2-user
docker ps
```

Dockerファイルをqiitaディレクトリが存在するディレクトリと同じディレクトリに作成し、中身を以下として保存します。
この中でCOPY qiita /qiitaとしています。Cloud9のqiitaディレクトリ上にあるDjangoのPJの各種ファイルをコンテナイメージにコピーする処理をしています。
```
# 使用するベースイメージ
FROM amazonlinux:2023

# 必要なパッケージのインストール
RUN dnf install -y python3 python3-pip
RUN dnf update -y pip

# Djangoとboto3をインストール
RUN pip3 install django boto3

# ポート80を公開
EXPOSE 80

# プロジェクトディレクトリの作成
WORKDIR /qiita

# ホストのDjangoプロジェクトディレクトリ"/qiita"をコンテナの"/qiita"ディレクトリにコピー
COPY qiita /qiita

# デフォルトコマンドを設定
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"]
```

上記Dockerfileを使いコンテナイメージを作成していきます。
イメージ作成後docker imagesコマンドを実行して作成されていることを確認します。
※名前が若干変ですが、ECRにアップロードできればいったんいいのでこのまま進みます。
```
ec2-user:~/environment $ pwd
/home/ec2-user/environment
ec2-user:~/environment $ ls
Dockerfile  README.md  qiita
ec2-user:~/environment $ docker build -t qiitadjangoapp .                                                                                                                                  
[+] Building 0.7s (11/11) FINISHED                                                                                                                                          docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                  0.0s
 => => transferring dockerfile: 671B                                                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/amazonlinux:2023                                                                                                                   0.6s
 => [internal] load .dockerignore                                                                                                                                                     0.0s
 => => transferring context: 2B                                                                                                                                                       0.0s
 => [1/6] FROM docker.io/library/amazonlinux:2023@sha256:5478f82c47e435ed988fa12a00b623ef3c920fadd669d40c596249cf81960c4c                                                             0.0s
 => [internal] load build context                                                                                                                                                     0.0s
 => => transferring context: 6.71kB                                                                                                                                                   0.0s
 => CACHED [2/6] RUN dnf install -y python3 python3-pip                                                                                                                               0.0s
 => CACHED [3/6] RUN dnf update -y pip                                                                                                                                                0.0s
 => CACHED [4/6] RUN pip3 install django boto3                                                                                                                                        0.0s
 => CACHED [5/6] WORKDIR /qiita                                                                                                                                                       0.0s
 => CACHED [6/6] COPY qiita /qiita                                                                                                                                                    0.0s
 => exporting to image                                                                                                                                                                0.0s
 => => exporting layers                                                                                                                                                               0.0s
 => => writing image sha256:43b074901c3646dcb71abd9b4dff195f16c00ca3afbfe70c97bbe9cc4b8a75c5                                                                                          0.0s
 => => naming to docker.io/library/qiitadjangoapp    

 ec2-user:~/environment $ docker images
REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
qiitadjangoapp   latest    43b074901c36   3 minutes ago   284MB
```

## ECRを作成し、コンテナイメージをアップロードする
ECRを作成します。
今回はパブリックリポジトリを作成しますので、こちらを押下します。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c1052141-0af8-f297-20a6-44a9c1ba4e22.png)
リポジトリの作成を押下します。
![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b0e5a354-5d03-71c9-2245-c76477e4f35a.png)
今回は以下のようなパラメータで作成していきました。
- リポジトリ名：qiita-django-repo
- オペレーティングシステム：Linux

![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ff5e83e2-70e5-fd6c-be82-779c7f91870b.png)
リポジトリが作成できたことを確認します。リポジトリ名がリンクとなっておりますのでこれを押下します。
![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/53f16337-82fb-aa7f-9cba-ada46e9f162d.png)
右上のプッシュコマンドの表示を押下します。
![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/79c6f286-35d1-e47d-30d1-57f4e94b736b.png)
作成したリポジトリにpushするコマンドセットが表示されます。これを使うことでCloud9に作成したコンテナイメージをpushすることが出来ます。
![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5ae7fe4e-451f-b460-0243-ce9a3a99e944.png)
セキュリティの件からコマンドの実行結果を乗せることは出来ませんが、コマンドをCloud9で実行すると以下のようにアップロードされることを確認します。イメージのURIはECSにコンテナデプロイする際に使用します。今回はここまでです。
![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e41b5d2a-514a-4b26-74d4-d725b2b1907e.png)