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でアクセスしてみると、以下の画面が表示されます。
ECS-CLIを利用してdockerで環境構築のメモ
ローカルのdocker-composeファイルを利用して、AWS上にEC2とコンテナを立ててみる為のメモです。
ECS-CLIをインストール。
$ brew install amazon-ecs-cli
AWS環境にアクセスする為のアクセスキーはecs-cli configureで設定する。
AWS Access Key IDとAWS Secret Access KeyはIAMの認証情報を利用する。
$aws configure AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [None]: Default output format [None]:
設定を確認する。
$ aws configure list
ECSクラスタの作成。
$ ecs-cli configure --region ap-northeast-1 --cluster my-ecs-cluster
確認する。
$ cat ~/.ecs/config version: v1 default: default clusters: default: cluster: my-ecs-cluster region: ap-northeast-1 default_launch_type: ""
ECSインスタンスコンテナを起動する。
$ ecs-cli up --keypair {EC2でのkeypair名} --capability-iam --size 2 --instance-type t2.micro
--keypairオプションに間違ってローカルのkeypairのパスを指定してしまった為に、以下のエラーが発生しました。
EC2上のkeypair名を指定します。
$ ecs-cli up --keypair /.ssh/keyPair.pem --capability-iam --size 2 --instance-type t2.micro INFO[0002] Created cluster cluster=ecs-cli-test ap-northeast-1 INFO[0003] Waiting for your CloudFormation stack resources to be deleted... INFO[0003] Cloudformation stack status stackStatus="DELETE_IN_PROGRESS" INFO[0038] Waiting for your cluster resources to be created... INFO[0038] Cloudformation stack status stackStatus="CREATE_IN_PROGRESS" INFO[0101] Cloudformation stack status stackStatus="CREATE_IN_PROGRESS" INFO[0164] Cloudformation stack status stackStatus="CREATE_IN_PROGRESS" ERRO[0197] Failure event reason="The key pair 'my-key-pair' does not exist" resourceType="AWS::AutoScaling::LaunchConfiguration" FATA[0197] Error executing 'up': Cloudformation failure waiting for 'CREATE_COMPLETE'. State is 'ROLLBACK_IN_PROGRESS'
エラーになってサイド実行するときは --force
オプションをつけて上書きする。
$ ecs-cli up --keypair keyPair --capability-iam --size 2 --instance-type t2.micro --force
EC2にインスタンスが作成される。
docker-compose.ymlを作成。
wordpress: image: wordpress mem_limit: 268435456 ports: - "80:80" links: - mysql mysql: image: mysql mem_limit: 268435456 environment: MYSQL_ROOT_PASSWORD: password
起動。
ecs-cli compose -f docker-compose.yml up
起動を確認。
$ ecs-cli ps Name State Ports TaskDefinition Health 7eb2a903-3ee5-47ed-a539-f5b3863c04a7/wordpress RUNNING 54.199.113.4:80->80/tcp Desktop:6 UNKNOWN 7eb2a903-3ee5-47ed-a539-f5b3863c04a7/mysql RUNNING Desktop:6 UNKNOWN
コンテナが起動しなかった場合や、停止してしまった場合はservice up
で再起動してみる。
$ ecs-cli compose -f docker-compose.yml service up
その他
サービスを削除。 作成されたEC2も削除される。
$ ecs-cli compose -f ./docker-compose.yml service rm
コンテナを表示。
$ ecs-cli ps
コンテナをすべて削除。
$ ecs-cli down --force
参考
AWSのパブリックインスタンス(EC2)でdockerを起動するメモ
AWSで作成したEC2にdockerでサーバーを立てて、パブリックIPでアクセスできるようにする為のメモ。
EC2にログインする。
ssh -i keypairへのパス ec2-user@XX.XXX.XXX.XX
sudo yum update -y sudo yum install -y docker sudo systemctl start docker.service sudo systemctl enable docker.service // ec2-user を docker グループに追加すると、sudo を使用せずに Docker コマンドを実行できる sudo usermod -a -G docker ec2-user
設定や、状態を確認。
sudo systemctl status docker.service docker --version
docker-composeをインストール。
Install Docker Compose | Docker DocumentationのLinuxを参考。
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
インストールを確認。
docker-compose --version
docker-composeファイルを作成。
vi docker-compose.yml
docker-composeは、例えばこんな感じ。
version: '3' services: php: image: php:7.2-apache volumes: - ./html:/var/www/html ports: - 80:80 container_name: php7.2-trial2 mysql: image: mysql:5.7 volumes: - ./mysql:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=test - MYSQL_USER=test - MYSQL_PASSWORD=test container_name: mysql5.7-trial2
コンテナを作成する。
docker-compose up -d
コンテナ作成時に以下のエラーが出た場合は、exitで一旦ログアウトする。
ERROR: Couldn’t connect to Docker daemon at http+docker://localhost – is it running?
コンテナが立ち上がる。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3213cdea250 php:7.2-apache "docker-php-entrypoi…" 4 minutes ago Up 5 seconds 0.0.0.0:80->80/tcp php7.2-trial2 449690dec0b7 mysql:5.7 "docker-entrypoint.s…" 21 minutes ago Up 5 seconds 3306/tcp, 33060/tcp mysql5.7-trial2
htmlディレクトリ配下に、index.htmlを作成する。
最終的にには、以下のような構成になる。
├── docker-compose.yml ├── html │ └──index.html └── mysql
EC2のパブリックIPでアクセスするとindex.htmlが表示される。
VesselでLaravelの開発環境を簡単に構築するメモ
Vesselを利用してLaravelの開発環境を構築するのが簡単だったのでメモです。
手順
laravelブロジェクトを作成。
$ composer create-project --prefer-dist laravel/laravel {プロジェクト名}
プロジェクトに移動。
$ cd {プロジェクト名}
Docker環境のセットアップ。
$ composer require shipping-docker/vessel
$ php artisan vendor:publish --provider="Vessel\VesselServiceProvider"
$ bash vessel init
プロジェクトを起動。
./vessel start
localhostでアクセス。