はじめに
「コンテナ時代のWebサービスの作り方 コンテナで動かすWebアプリケーション 著:nasum」を参考にさせていただき、コンテナで動かすWebアプリケーションの公開を目指します。やり始めから色々試行錯誤があったので、自分用メモとして残していこうと思います。
本記事を1回目として、3回目までが色々試行錯誤した部分の準備編で、軌道に乗り始めたら別記事で改めて整理したいと思います。
ゴール
- DockerコンテナをECSで管理して公開する
- masterブランチへのマージをフックにデプロイを実行する
使用する予定のもの
- GitHub コード管理
- CircleCI DockerイメージのビルドからECRへのプッシュ、およびデプロイ
- Docker 開発環境及びWebアプリケーションの稼働環境
- Terraform AWSの構成管理
- AWS関係 EC2、ECR、ECS、RDS、SSM
環境の構築
自分のPCはWindowsなので、Dockerのpythonイメージを使用して以降の部分を進める。
ただし、そもそもDockerについて自分の知識の大部分が怪しいので整理する。
Docker
docker image build -t dockerdemo:ver1 .
ビルドコンテキストにあるDockerfileをもとにイメージをビルドする。
-tオプションにより、イメージに名前を付けることができる。
-t dockerdemo:ver1のようにすると、tagがver1のイメージとして管理できる。
これをつけなければ、latestが自動的に付与される。
docker image ls
dockerイメージをリスト表示する
使用したDockerfileは下記の通り
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y \
vim
RUN mkdir /code
WORKDIR /code
RUN pip install awscli
ADD . /code
RUN wget https://release.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip && \ unzip ./terraform_0.12.24_linux_amd64.zip -d /usr/local/bin/
FROM python3.7のイメージを使用
ENV これがないと、バッファー
RUN updateとvimをインストール
RUN /codeフォルダを作り、それを作業フォルダにする
RUN awscliを使用してAWSのリソースを操作する
ADD カレントフォルダの内容を/codeフォルダにコピー
RUN terraformをインストール
RUNコマンド毎にdockerイメージが作成される。コンテナを立ち上げたときにコマンドを実行したい場合はCMDを使用する。
下記のdocker-compose.ymlでcommandを指定すると、CMDに上書きされる。
順番としては、
-
イメージを作成(ビルド)
docker image build . -
コンテナを起動
docker run -itd --name コンテナ名 --mount type=bind.source"$(pwd)"/bind-test,target=/app イメージ名:タグ
という感じ。
実際にはdocker-compose.ymlを使用する。
version: '3'
services:
web:
build: .
volumes:
- .:/code
tty: true
stdin_open: true
ttyとstdin_openをtrueにしないと、docker runで標準出力の入出力ができない。
volumesで .:/codeを指定し、バインドマウントでカレントフォルダをコンテナの/codeディレクトリへマウントする。
docker-compose up -d
docker exec -it test_web_1 /bin/bash
でコンテナをビルドから起動し、コンテナ上で操作する。
AWSの下準備
IAM
Terraformを使ってAWSの環境を構築するにあたり、Terraformを実行するためのIAMを作成する。
TerraformはAWSの構成を管理するものであるが、この実行用のIAMはTerraformによる管理ができないため、手動でWebコンソールから作成する必要がある。
作成した内容は以下の通り。
- プログラムによるアクセスにチェック
- ポリシーはAdministratorAccessをアタッチ
- アクセスキーIDとシークレットアクセスキーは別途控えておく
控えたアクセスキーIDとシークレットアクセスキーは、.aws/credentialsに記入し、
作成したDockerイメージのhomeディレクトリに配置することで、awscliコマンドで自動的にcredential情報を読み込んでくれる。
[default]
aws_access_key_id = アクセスキーID
aws_secret_access_key = シークレットアクセスキー
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y \
vim
RUN mkdir /code
WORKDIR /code
RUN pip install awscli
ADD . /code
RUN wget https://release.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip && \ unzip ./terraform_0.12.24_linux_amd64.zip -d /usr/local/bin/
# 追記
RUN cp -r .aws ~
確認
作成したDockerコンテナで、Terraformおよびawsclientが正しくインストールされているか確認する。
下記のコマンドで実行中のコンテナへ接続する。
docker exec -it test_web_1 /bin/bash
この時は、testフォルダからdocker-compose up -d
でコンテナを起動しているため、コンテナ名はtest_web_1
になった。
terraform --version
Terraform v0.12.24
aws --version
aws-cli/1.18.53 Python/3.7.7 Linux/4.9.184-linuxkit botocore/1.16.3
aws s3 ls
# エラーが返ってこないか確認する。
# 既にs3バケットが作成されている場合はs3バケット名が表示される。
以上で下準備は終了。。
2回目に移ります。