ECS(Fargate)にログインする その2

              図A システム構成

AWS ECSサービスを構築しよう(その2)

ECSサービス構築の二回目です。前回は,ECRに登録するdockerイメージをコンテナから作成するところまででした。今回は,ECRリポジトリーに登録,ECSサービスの構築手順です。
            図A 利用するAWSリソースと構成図

1. ECRにリポジトリ作成

作成したコンテナイメージを、コンテナレジストリのフルマネージドサービスである Amazon Elastic Container Registry (Amazon ECR) にアップロード(Push)します。
作成したコンテナイメージを、コンテナレジストリで一元管理することで、様々なコンテナ実行環境で利用しやすくなるメリットがあります。AWS コンソールにログインして,ECRリポジトリを作成します。
引用url ECRとは
               図B リポジトリ作成
このuriをコピーして,メモしておきます。後で、イメージのtag付けに必要になります。

1.2. EC2クライアントからECRにログインする

EC2クライアントから,ECRにpushする為に,ECRにログインする必要があります。ログイン用のスクリプトを作成します(login.sh)。そのスクリプトを利用してECRにログインします。
参照した URL AWS ECRにdockerイメージを登録する
aws ecr get-login --no-include-email --region ap-northeast-1 > login.sh ←一行です
[ec2-user@ip-10-128-1-19 ECR]$ bash ./login.sh
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded ← これが出ればログイン成功
前回作成したイメージから,ECR登録用のイメージtagを作成します。先ほど,コピーしておいた,uriが必要になります。
(123456789012はアカウントID)
docker tag redminesql:latest \
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/redmine6:latest
ECRにイメージをpushします
(123456789012はアカウントID)
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/redmine6:latest ← 一行です
これで,ECRのリポジトリにdockerイメージの登録が完了しました。
図AのECR Registoryです。

2. ECSサービスの構築

ECSサービスの構築は,ECSクラスターの作成,タスクの定義,サービスの作成という手順で行います。

2.1 ECSクラスターの作成

ECS クラスターは、コンテナを動かすための論理的なグループです。ECS を操作するために、まずは ECS クラスターを作成します。AWSコンソールから,クラスターの作成を行います。
ecs→クラスターの作成をクリックします。設定内容は,クラスター名,実行するVPC,サブネットです。
引用url ECSクラスターの作成
            図C ECSクラスターの作成1
              図D ECSクラスターの作成2

2.2. タスク定義

タスク定義とは、アプリケーションを動かすために、どのようにコンテナを動かすか、コンテナの動作を定義したものです。 例えば、コンテナイメージの種類、アプリケーションが利用するポート、コンテナが利用するデータボリュームなどを指定できます。
コンテナを動かす際のブループリントとして機能します。タスク定義をawsコンソールから行います。設定内容は,タスク定義名,ECRのuri,コンテナのlistenポート番号,動作させるサーバ(今回はFargate)です。
引用 URL タスク定義
              図E タスク定義1
              図F タスク定義2
              図G タスク定義3
              図H タスク定義4

2.3. サービスの作成

サービスとは、ECS 上でコンテナを動かすときに利用する概念の一つです。
サービスを使用すると、 Amazon ECS クラスターで、指定した数のコンテナ群(タスク)を維持できます。作成するサービスの定義をします。設定内容は,タスク定義の選択,サービス名,実行するVPC,サブネット,セキュリティグループ,ALBです。
引用url サービスとは
              図I サービス作成1
              図J サービス作成2
              図K サービス作成3
              図L サービス作成4
              図M サービス作成5
                 図N サービス作成6

3.サービスの実行

サービスの作成に成功したら,サービスを実行します。作成したサービスを選択する。ネットワーキングをクリック。オープンアドレス(ALBのアドレス)をクリックです。
              図O サービスの実行1
              図P サービスの実行2
              図Q サービスの実行3
              図R サービスの実行4
ALB経由で,Fargateコンテナのredmineログイン画面が出れば作成完了です。

AWS ECSサービスを構築しよう(その1)

Redmine4.2と,依存関係でDBが必要なので,mariaDB(10.11.2)(MySQL系)2つのdockerコンテナを作成します。Redmineコンテナ起動後にwebhookというpluginをインストール,更にDBをRDS(mySQL)に変更後,作成したコンテナからイメージを作成し,ECRに登録します。そのイメージからECSサービスをデプロイします。今回は,ECRに登録するイメージを作成するまでの手順です。

1. 利用するAWSのリソースと作成するシステム構成図

             図A システム構成図

2. Docker環境構築

EC2(図AのDockerコンテナ)にdocker,docker-composeをインストールして,dockerが動作する環境を構築します。
#Dockerのインストール
sudo yum install -y docker
sudo systemctl start docker
sudo usermod -a -G docker ec2-user
#自動起動を有効にする
sudo systemctl enable docker
#docker-composeのインストール
sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose  ←一行です
sudo chmod +x /usr/local/bin/docker-compose

#Docker Composeが使用できるか確認
/usr/local/bin/docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f

コマンド docker ps とすると以下のメッセージ出力
#Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containe
rs/json": dial unix /var/run/docker.sock: connect: permission denied
###対策 dockerグループにec2-userを追加
sudo usermod -g docker ec2-user

3. docker-compose.ymlファイルを作成して、docker コンテナを作成

作成するコンテナの設計図ですね。今回は,redmineとそのDBのコンテナを作成して,webhookというPluginを入れ、更にDBをRDS(Mysql)に変更します。
version: '3.8'
services:
  redmine:
    image: redmine:4.2
    container_name: redmine
    ports:
      - 80:3000
    environment:
      REDMINE_DB_MYSQL: redmine-db
      REDMINE_DB_PASSWORD: xxxxxx
    depends_on:
      - redmine-db
    restart: always

  redmine-db:
    image: mariadb
    container_name: redmine-db
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxx
      MYSQL_DATABASE: redmine
    volumes:
      - ./data/db:/var/lib/mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    restart: always

4. Docker コンテナの作成と起動

docker-compose.ymlファイルのあるディレクトリで以下のコマンドを実行します。完了したら,docker ps -a コマンドで動作しているかどうか確認します。
sudo su
cd /usr/local/src/redmine
/usr/local/bin/docker-compose  up -d
$ docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                       NAMES
9e7f0be2bc5b   redmine:4.2   "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   0.0.0.0:80->3000/tcp, :::80->3000/tcp       redmine
3cd27d886b4f   mariadb       "docker-entrypoint.s…"   8 seconds ago   Up 6 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   redmine-db

docker コンテナが作成されて起動されているのがわかります。Webでアクセスして確認しましょう。アドレスは、EC2のグローバルアドレスです。http://xx.xx.xx.xx/ログイン出来ればOKです。
               図B redmineログイン画面

5. webhook pluginをコンテナにインストール

作成したコンテナ(図AのDockerコンテナ)にwebhookというpluginをインストールします。
#Docker コンテナの中に入ります
docker container exec -it redmine bash
# pluginsディレクトリに移ります
root@f3baf480c406:/usr/src/redmine# cd plugins/
root@f3baf480c406:/usr/src/redmine/plugins# git clone https://github.com/suer/redmine_webhook.git ← 一行
root@f3baf480c406:/usr/src/redmine/plugins#  cd redmine_webhook
root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# bundle install
rake redmine:plugins:migrate RAILS_ENV=production
#docker コンテナから抜けます
root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# exit

redmine コンテナを再起動します。
docker stop redmine
docker start redmine
ブラウザでアクセスして、管理タブをクリックプラグインが表示されればOKです。
            図C webhook pluginインストール後

6. RDSと接続

privateサブネットに作成したRDS(Mysql)に接続させるように変更していきます。
#database接続定義(database.yml)の作成

production:
  adapter: "mysql2"
  host: "databasexxx.xxxxxx.ap-northeast-1.rds.amazonaws.com"
  port: "3306"
  username: "Admin"
  password: "xxxxxx"
  database: "redmine_db"

database.ymlをdockerコンテナ内にコピー
sudo docker cp database.yml redmine:/usr/src/redmine/config/

#redmine  migrate実行
#docker コンテナ内部に入ります
docker container exec -it redmine bash
/usr/src/redmin/# bundle exec rake generate_secret_token
/usr/src/redmine# bundle exec rake db:migrate RAILS_ENV=production
これで,ECSサービスとして起動可能なredmineコンテナが作成できました。
このコンテナを利用してECRに登録するimageを作成します。

7. ECR登録用のイメージ作成

作成したDockerコンテナからECRに登録するイメージを作成します。
#コンテナからイメージの作成
$ docker commit redmine redminesql

#イメージの確認
$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
redminesql        latest    304ab9ccde49   8 seconds ago   554MB
fortune-whale     latest    0df1bdab20e2   2 days ago      280MB
redmine           4.2       d4ea63462562   2 days ago      531MB
mariadb           latest    4a632f970181   2 weeks ago     401MB
docker/whalesay   latest    6b362a9f73eb   7 years ago     247MB
これで登録するdockerのイメージが作成できました。次回は、ECRにログインしてimageの登録,ECSのデプロイ,ECSタスクの実行する手順です。