のぐそんブログ

暗いおじさんがシコシコ書くブログです。

ECS Fargateにdockerイメージを利用してコンテナを立ててみる為のメモ

ECS Fargateにdockerイメージを利用してコンテナを立ててみる為のメモです。
自分用のメモなので、手順だけ書いています。

前提

VPCやサブネットは作成ずみ。

dockerイメージを作成する

適当なフォルダを作成。

$ mkdir ecs_sample
$ cd ecs_sample

Dockerfileを作成。
nginxのdockerコンテナを作成する為のイメージ。

FROM nginx:latest

COPY ./src /usr/share/nginx/html

srcディレクトリと表示確認用にhtmlを作成。

$ mkdir src

src/index.htmlの中身は何でもよい。

Hello!

dockerイメージを作成する。

$ docker build . -t ecs-test$

イメージが作成できているか確認。

$ docker images

REPOSITORY                                                            TAG                 IMAGE ID            CREATED             SIZE
ecs-test                                                              latest              7fdbd8fef5df        26 seconds ago      132MB

ローカルでdockerイメージからコンテナを起動してみる。
オプションの--rmはコンテナを停止したら、コンテナを削除する指定。

$ docker run --rm -p 8080:80 ecs-test -d

http://localhost:8080/で「Hello!」と表示されていればOK。

ECRにイメージを登録

作成したdockerイメージをECRに登録します。
ECRに登録したイメージはECSから利用することができます。

まずは登録用のリポジトリを作成(githubのリポジトリみたいなもの)。

f:id:nogson2:20201014175910p:plain

作成したリポジトリに、イメージをpushします。
push方法は、「プッシュコマンドを表示」のコマンドを実行していくだけです。

f:id:nogson2:20201014180414p:plain

イメージがプッシュされるとリポジトリに以下のように表示されます。

f:id:nogson2:20201014181716p:plain

ECSを作成

クラスターを作成

クラスター > クラスターを作成 > ネットワーキングのみ(AWS Fargateを使用)を選択して「次のステップへ」

クラスター名と、タグだけ設定して「作成」。

f:id:nogson2:20201014182823p:plain

クラスターが作成される。

f:id:nogson2:20201014182949p:plain

タスクを作成

タスクとはdocker-composeみたいなもの。

タスク定義 > 新しいタスク定義を作成 > FARGATEを選択して「次のステップへ」。

タスクの設定はこんな感じ。
タスクの実行 IAM ロールは初めての場合は、「新しいロールを作成」を選択すると自動で「ecsTaskExecutionRole」ロールが作成される。

f:id:nogson2:20201014183759p:plain

コンテナを追加します。
イメージには、ECRで登録したイメージのURI、 もしくはngins:latestのようにdocker hubにあるイメージを指定することもできる。

f:id:nogson2:20201014184440p:plain

タグ(Name:ecs-sample-taskとか)だけ追加して「作成」ボタンを押す。

サービスを作成する

サービスはクラスターとタスク定義を結びつけるようなもの。

クラスター > 作成したクラスタ > 「サービス」タブ > 「作成」を押す。

f:id:nogson2:20201014185030p:plain

以下のような設定をして 「次のステップへ」を押す。

f:id:nogson2:20201014185631p:plain

VPCやサブネット、セキュリティグループ(インターネットにつながる)を設定して「次のステップへ」を押す。

f:id:nogson2:20201014190047p:plain

Auto Scaling はそのままの設定で「次のステップへ」を押し「サービスの作成」を押す。

サービスが作成され、「タスク」が起動します。
コンテナが起動すると、ステータスがRUNNINGになります。

f:id:nogson2:20201014190425p:plain

タスクのパブリックIPから表示を確認することができます。

f:id:nogson2:20201014224044p:plain

EC2のApacheでBASIC認証、DIGEST認証メモ

EC2にssh接続後の手順。

Apacheをインストール。

$ sudo yum update
$ sudo yum install httpd -y
$ sudo chkconfig httpd on

BASIC認証

ユーザー名とパスワードを設定する。

sudo htpasswd -c -b /etc/httpd/conf/.htpasswd {user} {password}

/etc/httpd/conf/httpd.confに以下を追加。

<Directory "/var/www/html/">
  AuthUserFile /etc/httpd/conf/.htpasswd
  AuthGroupFile /dev/null
  AuthName "Basic Auth"
  AuthType Basic
  Require valid-user
</Directory>

Apacheを起動。

$ sudo service httpd start

DIGEST認証

ユーザー名とパスワードを設定する。

// htdigest -c /etc/httpd/conf/.digestpass "{領域名}" {user}
$ htdigest -c /etc/httpd/conf/.digestpass "Digest Auth" useri

New password: {password}
Re-type new password: {password}

/etc/httpd/conf/httpd.confに以下を追加。

<Directory "/var/www/html">
    AuthType Digest
    AuthName "Digest Auth"
    AuthUserFile "/etc/httpd/conf/.digestpass"
    Require valid-user
</Directory>

Apacheを起動。

$ sudo service httpd start

herokuを利用してnuxtをSSRでホスティングするメモ

herokuを利用してnuxtをSSRでホスティングする。

nuxtプロジェクトを作成する。
プロジェクトはSSRで作成する。

$ yarn create nuxt-app sampleApp
$ cd sampleApp

SSRを試したいので、/pages配下にsub/_id.vueを作成する。

<template>
  <div>sub</div>
</template>

<script>
export default {
  name: 'Id'
}
</script>

ビルドする。

$ yarn build

package.jsonを変更。
heroku-prebuild後に実行されるコマンドをheroku-postbuildに指定する。

  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "heroku-postbuild": "npm run build" // + 追加
  },

Heroku CLIをインストール。

$ brew tap heroku/brew && brew install heroku

Herokuにアプリを作成。

f:id:nogson2:20201007212538p:plain

環境変数を設定。

HOST : 0.0.0.0

f:id:nogson2:20201007214654p:plain

herokuにログインする。
ブラウザが立ち上がるのでログインする。

$ heroku login

gitに登録。

$ heroku git:remote -a sampleapp201007

herokuにプッシュ。

$ git add .
$ git commit -m 'initial commit'
$ git push heroku master

herokuのコンソールからアプリを表示。

f:id:nogson2:20201007220356p:plain

subページも表示。

f:id:nogson2:20201007215858p:plain

vesselで作ったローカルの開発環境をEC2にそのまま作る手順のメモ

vesselで作ったらローカルの開発環境を、EC2にそのまま作る手順のメモです。
自分用のメモなので参考にならないかもしれません。

前提

ローカル環境はvesselを使って作成。
作成方法はこちらを参考に。

EC2にLaravelのプロジェクトファイルをcloneする

EC2に接続。

$ ssh -i {keypair} ec2-user@{パブリックアドレス}

vesselで環境を作るので、dockerをインストール。

$ sudo yum update -y
$ sudo yum install -y docker
$ sudo systemctl start docker.service
$ sudo systemctl enable docker.service
$ sudo usermod -a -G docker ec2-user

docker-composeもインストール。
Install Docker Compose | Docker DocumentationのLinuxを参考。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

phpをインストール。

$ sudo amazon-linux-extras install php7.3
$ sudo yum install php-cli php-xml php-json php-mbstring php-process php-common php-fpm php-zip php-mysqlnd -y

composerをインストール。

$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

vesselをインストールする場合にメモリ不足になる場合があるので、以下を実行。

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

gitのインストール。

$ sudo yum install git

ファイルをgit cloneする。

$ sudo git clone {gitのurl}

cloneしたファイルの権限を変更。

sudo chmod -R 777 {colneしたファイル}

cloneしたファイルへ移動。

$ cd {colneしたファイル}

.envを作成

cp .env.example .env

mysqlのhostを変更

DB_CONNECTION=mysql
DB_HOST=10.0.0.200 #インスタンスのプライベートIP
DB_PORT=3306
DB_DATABASE=db
DB_USERNAME=root
DB_PASSWORD=secret

./vesselのインストールとセットアップ。

$ composer require shipping-docker/vessel
# dockerフォルダ配下にイメージ用のapp、mysql、nodeなどが作成済みの場合は以下は不要
$ php artisan vendor:publish --provider="Vessel\VesselServiceProvider"
$ bash vessel init
$ ./vessel start

docker -psでコンテナが立ち上がっているかを確認してマイグレーションを実行。
※ これはDBとマイグレーションを利用している場合のみ。

./vessel php artisan migrate

コンテナが立ち上がっていなかったら、以下を実行。

./vessel up -d

mysql接続に関して困ったことメモ

サーバーやインフラの知識は素人同然なので間違いや、説明不足が多いと思います。
また、ハマりそうなので自分用のメモです。

前提

  • Laravelを利用
  • MySQL8.0.xを利用
  • EC2にDBサーバーをたてる

問題

ローカル環境では問題なくDB(mysql)に接続できていた。
EC2にSSH接続はできている。
mysqlコマンドでデータベースへログインもてきている。
Laravel php artisan migrateを実行するとエラーになる。

.envの設定

DB_CONNECTION=mysql
DB_HOST=10.0.0.69 # EC2のプライベートIPアドレス
DB_PORT=3306
DB_DATABASE=db
DB_USERNAME=root
DB_PASSWORD=password

ユーザーを確認

EC2上でmysqlにログイン。
ユーザー情報を確認。

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

ローカル環境と少し違う。
ローカル環境はこんな感じだった。

+---------------+-----------+-----------------------+
| user          | host      | plugin                |
+---------------+-----------+-----------------------+
| root          | localhost | mysql_native_password |
| mysql.session | localhost | mysql_native_password |
| mysql.sys     | localhost | mysql_native_password |
| root          | %         | mysql_native_password |
| default       | %         | mysql_native_password |
+---------------+-----------+-----------------------+

ユーザーを作成して、権限や認証方式を変更

ローカル環境に合わせてユーザーの追加や、権限や認証方式を変更していく。

◎ユーザーを追加

hostがlocalhostだと外部からの接続ができない。
外部からの接続ができる%を指定する。

create user 'root'@'%' identified by 'password';

◎権限を変更

dbデータベースへのアクセスを許可する。

grant all privileges on db.* to 'root'@'%';

◎認証方式の変更

MySQL8.0 認証方式を変更する(Laravel5)を参考にする。

MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルト
PHPのMySQL接続ライブラリがcaching_sha2_passwordに未対応のため接続不可 解決策としては認証方式をmysql_native_password に戻す

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

/etc/my.cnfに以下を追記。(コメントアウトしてあったので表示しただけ)

default_authentication_plugin=mysql_native_password

まとめ

ローカルで利用しているdockerファイルで環境を構築すればこんな問題はおこらなかったのかも。。。

vesselでmysqlのパスワードを変更しようとして困ったメモ

vesselで.envのmysqlのパスワードを変更しようとしたとところ、変更できず困ったのでメモを残しておく。 そもそもDockerを正しく理解できていない。

ともかく、以下を参照したらできた。
volumeを削除しないとだめなのかな。。。

Vessel - Docker dev environments for Laravel

# Spin down the containers
./vessel stop

# Destroy the volume created
## List volumes to find it
docker volume ls
## Destroy the appropriate one
docker volume rm vesselexample_vesselmysql

# Set a password within the .env file
DB_PASSWORD=secret

# Start the containers back up
./vessel start

ログインして試してみたら、パスワードが変更されていた。

./vessel exec mysql mysql -u root -p

ECRにDockerイメージをプッシュして、ECSのクラスターをつくって、EC2にコンテナを起動させる為のメモ

ECRにDockerイメージをプッシュして、ECSのクラスターをつくって、EC2にコンテナを起動させる為のメモです。
自分用のメモなのであまり参考にならないと思います。

ローカルで簡単なdockerコンテナを起動する

サンプルファイルをcloneする。

$ git clone https://github.com/aws-samples/ecs-demo-php-simple-app

cloneしたフォルダに移動。

$ cd ecs-demo-php-simple-app

dockerイメージを作成。

$ docker build -t amazon-ecs-sample .

コンテナを起動。

$ docker run -d -p 80:80 --name amazon-ecs-sample amazon-ecs-sample:latest

http://localhost/でアクセス。

f:id:nogson2:20200803235309p:plain

ECRにdockerイメージをpush

AWSコンソールのECS > ECRから、リポジトリを作成する。

f:id:nogson2:20200803235854p:plain

リポジトリが作成されます。
次に「プッシュコマンドの表示」を押します。

f:id:nogson2:20200804000016p:plain

プッシュコマンドを順番に実行していく。

f:id:nogson2:20200804000254p:plain

  1. 認証トークンを取得し、レジストリに対して Docker クライアントを認証します。 AWS CLI を使用します。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
  1. 以下のコマンドを使用して、Docker イメージを構築します。
docker build -t amazon-ecs-sample .
  1. 構築が完了したら、このリポジトリにイメージをプッシュできるように、イメージにタグを付けます。
docker tag amazon-ecs-sample:latest XXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/amazon-ecs-sample:latest
  1. 以下のコマンドを実行して、新しく作成した AWS リポジトリにこのイメージをプッシュします。
docker push XXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/amazon-ecs-sample:latest

リポジトリ内にイメージが作成される。

f:id:nogson2:20200804001229p:plain

タスクを定義する

EC2でコンテナを起動させるにはタスクを定義する必要があります。
タスクとは複数のコンテナをグループにしたものです。
docker-compose.ymlに似ている。 起動するコンテナが1つでも複数でも定義が必要になる。

タスクはjsonファイルで登録することができるので、以下のサンプルを利用します。 https://github.com/aws-samples/ecs-demo-php-simple-app/blob/master/simple-app-task-def.json

◎ simple-app-task-def.json

{
    "family": "console-sample-app",
    "volumes": [
        {
            "name": "my-vol",
            "host": {}
        }
    ],
    "containerDefinitions": [
        {
            "environment": [],
            "name": "simple-app",
            "image": "{ECRにアップロードしたイメージ}",
            "cpu": 10,
            "memory": 500,
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "my-vol",
                    "containerPath": "/var/www/my-vol"
                }
            ],
            "entryPoint": [
                "/usr/sbin/apache2",
                "-D",
                "FOREGROUND"
            ],
            "essential": true
        },
        {
            "name": "busybox",
            "image": "busybox",
            "cpu": 10,
            "memory": 500,
            "volumesFrom": [
            {
              "sourceContainer": "simple-app"
            }
            ],
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "/bin/sh -c \"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done\""
            ],
            "essential": false
        }
    ]
}

タスクを登録する。

aws ecs register-task-definition --cli-input-json file://simple-app-task-def.json

"family": "console-sample-app"に定義したconsole-sample-appというタスクが作成されます。

f:id:nogson2:20200804212117p:plain

クラスターを作成

クラスターとは、タスクを配置するEC2インスタンス群のこと。タスクの実行環境になります。

イメージとしてはこんな感じ(自信なし)??

f:id:nogson2:20200804215531p:plain

クラスターの作成手順

ECS > クラスターから「クラスターを作成」を押す。

「EC2 Linux + ネットワーキング」を選択して「次のステップ」を押す。

とりあえず以下の設定して「作成」を押す。

項目
クラスター名 sample-cluster
EC2 インスタンスタイプ t2.micro
インスタンス数 2
キーペア 作成したもの

クラスターが作成される。

f:id:nogson2:20200804222510p:plain

クラスターでタスクを実行

タブの「タスク」から「新しいタスクの実行」を押す。

f:id:nogson2:20200804222618p:plain

以下の設定をして「タスクの実行」を押す。

f:id:nogson2:20200804223626p:plain

タスクが実行されインスタンスが作成されます。

f:id:nogson2:20200804224146p:plain

インスタンスのパブリックDNSでアクセスしてみると、以下の画面が表示されます。

f:id:nogson2:20200803235309p:plain