LoginSignup
4
6

More than 1 year has passed since last update.

【AWS】 (初心者向け) CodePipelineを使ったECSコンテナのデプロイ自動化 その1(ECR, ECS Fargate)

Last updated at Posted at 2022-08-23

概要

CodePipelineでコンテナデプロイを実行するCICD構築をまとめました。

実行されるパイプラインの流れは下記です。

  1. CodeCommitにプッシュ
  2. 特定のブランチへのプッシュをトリガーにCodePipelineを起動
  3. CodeBuildにてビルドを開始
  4. ECRリポジトリにイメージをプッシュ
  5. ECS Fargateにデプロイ

コンテナはFlaskを実行するコンテナを構築します。
CICDに焦点をあてるため、簡単なソース更新にてデプロイ実行を確認します。

目次

記事を3つに分割しました。

  1. コンテナ構築 / 起動
    1-1. Flaskアプリケーションの作成
    1-2. ローカル環境でコンテナの作成 / 起動確認
    1-3. ECRへイメージをプッシュ
    1-4. ECSでコンテナ起動 ←本記事はここまで

  2. CICDパイプラインの作成
    2-1. CodeCommitの作成
    2-2. CodeBuildの作成
    2-3. CodePipelineの作成

  3. 上記のコンテナ / CICDパイプライン構築をコード化
    3-1. CloudFormationテンプレート

後続の記事はこちら
【AWS】 (初心者向け) CodePipelineを使ったECSコンテナのデプロイ自動化 その2(CodeCommit, CodeBuild, CodePipeline)
【AWS】 (中級者向け) CodePipelineを使ったECSコンテナのデプロイ自動化 その3(CloudFormationでインフラコード化)

構成図

最終的な構成はこちら
aws構成図.png

1. コンテナ構築 / 起動

1-1. Flaskアプリケーションの作成

まずはローカル環境で簡単なFlaskアプリケーションを作成します。
今回はWebサーバーを立てて静的ページを返すだけの超簡単な内容にします。

# フォルダ構成
.
├── Dockerfile
├── app.py
├── requirements.txt
├── templates
│   └── index.html
└── venv # 仮想環境は必要に応じて

Flaskをインストールしておきましょう。

requirements.txt
Flask
pip install -r requirements.txt
  • app.py
app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=80)
  • templates/index.html
    render_templateで指定するhtmlファイルはtemplates内に作成します。
    内容はなんでもいいです。
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Flask</title>
</head>
<body>
    <p>Hello from flask</p>
</body>
</html>

1-2. ローカル環境でコンテナの作成 / 起動確認

つづいてローカル環境でコンテナを構築します。
同じフォルダ内にDockerFileを作成します。

  • Dockerfile
    ここでは最小限の内容にします。
Dockerfile
FROM python:3.9

WORKDIR /app
ADD . /app

RUN pip install --upgrade pip
RUN pip install -r requirements.txt

EXPOSE 80

CMD ["python", "app.py"]

下記コマンドでイメージを作成、コンテナを起動します。

docker build -t docker_flask .
# docker_flaskは任意は名前でok

docker run --name flask -d -p 80:80 docker_flask
# --name flaskも任意の名前でok

open http://127.0.0.1
# index.htmlの内容が表示されればok

1-3. ECRへイメージをプッシュ

それではローカル環境で確認したイメージをECRにプッシュしましょう。
AWSマネジメントコンソールにてAmazon ECR管理画面に移動しプライベートリポジトリを作成します。
リポジトリ作成後、プッシュコマンドを実行します。
※イメージ管理画面からコマンドを表示できるのでコピペできます。

# ECRへログイン
# リージョンは東京リージョン(ap-northeast-1)を使用しています。
# アカウントIDはそれぞれのAWSアカウントIDに変更してください。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com
# Login Succeededを確認

# リポジトリにイメージをプッシュできるようタグを付与
docker tag docker_flask:latest ${AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/${作成したECRリポジトリ名}:latest

# ECRにプッシュ
docker push ${AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/${作成したECRリポジトリ名}:latest

1-4. ECSでコンテナ起動

今回は設定内容の作り込みはせず、ほぼデフォルトの最小限の設定で作成します。

1-4-1. クラスター作成

AWSマネジメントコンソールにてAmazon ECS管理画面に移動しまずはクラスターを作成します。
クラスターテンプレートの選択はネットワーキングのみを選択。
ecs_cluster_01.png
VPCの作成にチェックを入れた場合は、CloudFormationが起動して自動でパブリックネットワークが作成されます。

  • CloudFormationで作成されるリソースは下記
    • VPC(&セキュリティグループ)
    • サブネット
    • ルートテーブル
    • インターネットゲートウェイ

今回は上記のリソースを前もって作成していないため、VPCの作成にチェックを入れた状態でクラスター作成を進めます。

1-4-2. タスク定義の作成

起動タイプはFargateを選択します。
タスクサイズは今回は最小のもので良いでしょう。

  • タスクメモリ (GB): 0.5GB
  • タスク CPU (vCPU): 0.25vCPU

コンテナの定義で、コンテナの追加ボタンをクリックして先ほどECRにプッシュしたイメージを設定します。
${AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/${作成したECRリポジトリ名}:latest
ecs_container_01.png
作成したイメージの詳細画面のURIをコピペでok
ecs_container_02.png

そのほかの設定は今回はデフォルトのままで良いでしょう。

1-4-3. サービス作成

先ほど作成したクラスターを選択してサービスを作成します。
起動タイプにFargateを選択します。
タスク定義には前項目で作成したものを選択し、タスク数は1で良いでしょう。
デプロイメントタイプは今回はローリングアップデートを選択します。
ecs_service_01.png

ネットワーク構成では、作成したVPC、サブネットを選択します。
ecs_service_02.png
今回はセキュリティグループもあわせて自動作成します。もちろん既存のセキュリティグループも選択できます。
自動作成されるセキュリティグループのインバウンドルールは下記。

タイプ プロトコル ポート範囲 ソース
HTTP TCP 80 0.0.0.0/0

今回はロードバランサー、AutoScalingの設定も無しでスキップします。

サービスを作成したらタスクタブに移動し、先ほど作成したタスク定義を使用したタスクが立ち上がっていることを確認します。
タスクの前回のステータスRUNNINGになるまで待ちましょう。
ステータスがRUNNINGになりましたらタスクのパブリックIPにブラウザからアクセスしてみましょう。

先ほど作成したindex.htmlが表示されたらサーバレスコンテナの起動、表示確認は完了です。

まとめ

今回はECRへプッシュ、ECSへデプロイまでをかなり簡単にまとめました。
次記事でCodeCommitを使ったバージョン管理、ソースの更新後のECRへ再プッシュ→ECSへ再デプロイの流れをパイプラインで自動化する流れをまとめます。

後続の記事はこちら
【AWS】 (初心者向け) CodePipelineを使ったECSコンテナのデプロイ自動化 その2(CodeCommit, CodeBuild, CodePipeline)
【AWS】 (中級者向け) CodePipelineを使ったECSコンテナのデプロイ自動化 その3(CloudFormationでインフラコード化)

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