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のリポジトリみたいなもの)。
作成したリポジトリに、イメージをpushします。
push方法は、「プッシュコマンドを表示」のコマンドを実行していくだけです。
イメージがプッシュされるとリポジトリに以下のように表示されます。
ECSを作成
クラスターを作成
クラスター > クラスターを作成 > ネットワーキングのみ(AWS Fargateを使用)
を選択して「次のステップへ」
クラスター名と、タグだけ設定して「作成」。
クラスターが作成される。
タスクを作成
タスクとはdocker-composeみたいなもの。
タスク定義 > 新しいタスク定義を作成 > FARGATE
を選択して「次のステップへ」。
タスクの設定はこんな感じ。
タスクの実行 IAM ロールは初めての場合は、「新しいロールを作成」を選択すると自動で「ecsTaskExecutionRole」ロールが作成される。
コンテナを追加します。
イメージには、ECRで登録したイメージのURI、
もしくはngins:latest
のようにdocker hubにあるイメージを指定することもできる。
タグ(Name:ecs-sample-taskとか)だけ追加して「作成」ボタンを押す。
サービスを作成する
サービスはクラスターとタスク定義を結びつけるようなもの。
クラスター > 作成したクラスタ > 「サービス」タブ > 「作成」を押す。
以下のような設定をして 「次のステップへ」を押す。
VPCやサブネット、セキュリティグループ(インターネットにつながる)を設定して「次のステップへ」を押す。
Auto Scaling はそのままの設定で「次のステップへ」を押し「サービスの作成」を押す。
サービスが作成され、「タスク」が起動します。
コンテナが起動すると、ステータスがRUNNINGになります。
タスクのパブリックIPから表示を確認することができます。
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にアプリを作成。
環境変数を設定。
HOST : 0.0.0.0
herokuにログインする。
ブラウザが立ち上がるのでログインする。
$ heroku login
gitに登録。
$ heroku git:remote -a sampleapp201007
herokuにプッシュ。
$ git add . $ git commit -m 'initial commit' $ git push heroku master
herokuのコンソールからアプリを表示。
subページも表示。
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/
でアクセス。
ECRにdockerイメージをpush
AWSコンソールのECS > ECRから、リポジトリを作成する。
リポジトリが作成されます。
次に「プッシュコマンドの表示」を押します。
プッシュコマンドを順番に実行していく。
- 認証トークンを取得し、レジストリに対して 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
- 以下のコマンドを使用して、Docker イメージを構築します。
docker build -t amazon-ecs-sample .
- 構築が完了したら、このリポジトリにイメージをプッシュできるように、イメージにタグを付けます。
docker tag amazon-ecs-sample:latest XXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/amazon-ecs-sample:latest
- 以下のコマンドを実行して、新しく作成した AWS リポジトリにこのイメージをプッシュします。
docker push XXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/amazon-ecs-sample:latest
リポジトリ内にイメージが作成される。
タスクを定義する
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
というタスクが作成されます。
クラスターを作成
クラスターとは、タスクを配置するEC2インスタンス群のこと。タスクの実行環境になります。
イメージとしてはこんな感じ(自信なし)??
クラスターの作成手順
ECS > クラスターから「クラスターを作成」を押す。
「EC2 Linux + ネットワーキング」を選択して「次のステップ」を押す。
とりあえず以下の設定して「作成」を押す。
項目 | 値 |
---|---|
クラスター名 | sample-cluster |
EC2 インスタンスタイプ | t2.micro |
インスタンス数 | 2 |
キーペア | 作成したもの |
クラスターが作成される。
クラスターでタスクを実行
タブの「タスク」から「新しいタスクの実行」を押す。
以下の設定をして「タスクの実行」を押す。
タスクが実行されインスタンスが作成されます。
インスタンスのパブリックDNSでアクセスしてみると、以下の画面が表示されます。