のぐそんブログ

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

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にインスタンスが作成される。

f:id:nogson2:20200802225317p:plain

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

参考

ローカルで使用したdocker-compose.ymlを使ってECS上でコンテナを起動する

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でアクセス。

f:id:nogson2:20200711110331p:plain

EC2上でgit cloneしてアプリケーションを起動する

EC2上でgithubのプロジェクトデータをcloneしてきて、起動するとこまでやってみたいと思います。
自分ようのメモなので間違っているかもしれません。

EC2を設定する

EC2にログイン。
セキュリティグループやインターネットゲートウェイなどの設定はしておく。

$ ssh -i {keypair.pemを指定} ec2-user@XX.XXX.XX.XXX

すべてのパッケージを最新にする。

$ sudo yum update -y

Apacheをインストールして起動する。

$ sudo yum install httpd
$ sudo systemctl start httpd
$ sudo systemctl enable httpd

php7.2をインストール。

$ sudo amazon-linux-extras install php7.2

必要そうなモジュールをインストール。

$ sudo yum install php-cli php-common php-devel php-fpm php-gd php-mysqlnd php-mbstring php-pdo php-xml

php.intの設定

必要に応じてphp.iniファイルの設定を変更する。
ファイルパスは以下のコマンドで確認できる。

$ php -r "echo phpinfo();" | grep "php.ini"
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
// バックアップをとる
$ sudo cp /etc/php.ini /etc/php.ini.default

// メモリ上限
memory_limit = 256M

// エラーログのパス
error_log = /var/log/php/php-error.log

// POSTデータに許可される最大サイズ
post_max_size = 128M

// アップロードされるファイルの最大サイズ
upload_max_filesize = 20M

// タイムゾーン
date.timezone = Asia/Tokyo

詳しくはこちら

php.iniが正しく設定されているかを確認して、Apacheを再起動。

$ sudo service httpd configtest
Syntax OK
$ sudo systemctl restart httpd

ファイルの許可を設定

Apache httpd は、Apache ドキュメントルートと呼ばれるディレクトリに維持されるファイルを提供します。Amazon Linux Apache ドキュメントルートは /var/www/html であり、デフォルトでは root によって所有されます。

ec2-user アカウントがこのディレクトリで複数のファイルを操作することを許可するには、ディレクトリの所有権とアクセス許可を変更する必要があります。このタスクを行うには、複数の方法があります。このチュートリアルでは、ec2-user を apache グループに追加し、apache ディレクトリの所有権を /var/www グループに付与し、グループへの書き込み権限を割り当てます。 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html#prepare-lamp-server

ユーザー (この場合は ec2-user) を apache グループに追加します。

$ sudo usermod -a -G apache ec2-user

ec2-userをログアウト。

$ exit

再度ログイン。

$ ssh -i {keypair.pemを指定} ec2-user@XX.XXX.XX.XXX

グループへの追加を確認。

$ groups
ec2-user adm wheel apache systemd-journal

/var/wwwとそのコンテンツのグループ所有権を apache グループに変更。

グループの/var/wwwの書き込み許可を追加。

$ sudo chmod 2775 /var/www

/var/wwwとサブディレクトのディレクトリ*許可を変更。

$ find /var/www -type d -exec sudo chmod 2775 {} \;

/var/wwwとサブディレクトリのファイル許可を変更。

$ find /var/www -type f -exec sudo chmod 0664 {} \;

composerのインストール

composerのインストール。

$ curl -sS https://getcomposer.org/installer | php

composerコマンドのパスを通す。

$ sudo mv composer.phar /usr/local/bin/composer

確認。

$ which composer
/usr/local/bin/composer

アプリをgtihubからCloneする

EC2上でgit cloneした際にgit: command not foundとなった場合、gitをインストールする必要があります。

$ sudo yum install git
$ cd /var/www
$ git clone https://github.com/XXXX/XXX.git

Apatfchの設定を変更

http.confファイルを変更。

$ sudo vi /etc/httpd/conf/httpd.conf
// DocumentRoot “/var/www/html” を↓に変更
DocumentRoot "/var/www/{プロジェクト名}/public"

// .htaccessを有効化する為、以下を追加
<Directory /var/www/プロジェクト名/public>
 AllowOverride All
</Directory>

Apatchをリスタート。

$ sudo service httpd restart

composerのパッケージをインストール

$ cd /var/www/{プロジェクトのフォルダ名}
$ composer install

Laravelの設定

/storage/bootstrap/cacheを書き込み可能にする。

$ sudo chmod -R 777 /var/www/{プロジェクトのフォルダ名}/storage
$ sudo chmod -R 775 /var/www/{プロジェクトのフォルダ名}/bootstrap/cache

.envファイルを作成して、アプリケーションKeyを作成。

$ cp .env.example .env
$ php artisan key:generate

ここまでくるとEC2のパブリックIPでLaravelプロジェクトの画面が表示できるようになります。

MySQLを設定

MariaDBがインストール済みかを確認します。
MariaDBが入っていると競合してMySQLがインストールできません。

$ sudo yum list installed | grep mariadb

インストール済みの場合は削除します。

$ sudo yum remove mariadb-libs

MySQLのリポジトリを追加。

$ sudo yum install http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

MySQLをインストールする。

$ yum install mysql-community-server

起動したりする。

$ sudo service mysqld start

//DBサーバー起動時にMySQLが自動で起動するようにする
$ sudo chkconfig mysqld on

MySQL5.7の場合は初期のパスワードを確認。

$ sudo cat /var/log/mysqld.log | grep 'temporary password'

MySQLの初期設定でパスワードを再設定。

$ sudo mysql_secure_installation

パスワードのポリシーがきつい場合はゆるくする。

mysql -u root -p
Enter password: {↑で確認したパスワードを入力}

// 文字列の長さを変更
mysql> set global validate_password_length=6; 
// ポリシーを変更
mysql> set global validate_password_policy=LOW; 

ユーザー作成。

mysql> create user 'ユーザー名'@'localhost' identified by 'パスワード';
// create user 'default'@'localhost' identified by '12345678'

// 作成したユーザーを確認
mysql> SELECT Host, User FROM mysql.user;
+-----------+---------------+
| Host      | User          |
+-----------+---------------+
| localhost | default       |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+

DBを作成。

mysql> create database {DB名};
// 作成したDBを確認
mysql> show databases;

DBにアクセスできるユーザーを設定。

mysql> grant all privileges on {作成したDB名}.* to '{作成したユーザー名}'@'localhost';
mysql> FLUSH PRIVILEGES;

ユーザーのパスワード認証方式を変更。

ALTER USER 'default'@'localhost' IDENTIFIED WITH mysql_native_pass

mysqlからログアウトして.envを書き換える。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE={DB名}
DB_USERNAME={作成したユーザー}
DB_PASSWORD={作成したユーザーのパスワード}

migrationを実行する。

$ php artisan migrate

Lag SOPを利用して値の変化をなめらかにする

Lag SOPとは

Lag CHOPはラグ(遅延)とオーバーシュート(超過)を追加します。 ベロシティ(速度)とアクセラレーション(加速)チャンネルを制限することもできます。 ラグ(遅延)は、入力チャネルの急速な変化速度を落とします。 オーバーシュート(超過)は、入力チャネルの変化を増幅します。 2つの値が各パラメータにあります。 例えば、ラグ・エフェクトで、入力チャネル値が増加している場合、最初のラグ・パラメータが使用されます。そして、チャンネル値が減少している場合、2番目のラグ・パラメータが使われます。 これは、急速な上昇と緩慢な降下を与えることができます。 しかし、多くの場合ラグ・アップ、ダウンは同じ値に保たれます。 急転しない効果は、Filter CHOPを参照してください。 Lag CHOP | TouchDesigner 日本語ドキュメント

使い方がよくわかりませんでしたが、値の変化をなめらかにするときに便利だったのでメモしておきます。

サンプルの動きとしてはこんな感じです。

f:id:nogson2:20200614231202g:plain

ポイントはLag SOPのTime SliceONにすることです。

f:id:nogson2:20200614231455p:plain

AWS ELBの基礎基礎メモ

ELB(Elastic Load Balancing)について

ELBとは

アクセスを複数のEC2インスタンスに負荷分散する役割を担います。
またヘルスチェックを行い、複数あるインスタンスの中から正常なインスタンスのみに振り分けます。

f:id:nogson2:20200507004203p:plain

ELBにはALB(Application Load Balancer)と、NLB(Network Load Balancer)があります。

利用目的

負荷分散、単一障害点対応

一般的な利用目的としては、大量のアクセスを複数のインスタンスで処理する負荷分散と、特定のインスタンスに障害が発生した場合にサービスを止めない可用性の担保になります。

仮にEC2がダウンした場合。
サービスの継続ができなくなる。

f:id:nogson2:20200507001544p:plain

ELBを利用してサイトを冗長化した場合は、仮に1台がダウンしてもサービスの継続が可能。

f:id:nogson2:20200507001920p:plain

SSLターミネーション

ELBにHTTPS通信で使用するSSL証明書をアタッチすることで、通信の暗号化・復号も担ってくれます。
その為、ELB配下のインスタンスで暗号化・復号をやならくてよいのでインスタンスの負荷を軽減することができます。

※ SSL証明者はACM(AWS Certificate Manager)で無料で作成することができます

ヘルスチェック

登録されているインスタンスの状態を監視することができます。 正常に動作していないインスタンスはELBの対象から切り離されます。

ELBの作成

「EC2 > ロードバランサー > ロードバランサーの作成」を押します。

f:id:nogson2:20200507223238p:plain

ロードバランサーの種別を選択します。

Application Loadを選択します。 f:id:nogson2:20200507223514p:plain

ロードバランサーの設定をします。

項目 設定
名前 ELBの名前。「Test-EBL」と設定した場合はDNSは「Test-EBL-XXXXXXXX.ap-northeast-1.ebl.amazonaws.com」のようになる
スキーマ External-Web:インターネット向け
Internal=ELB:内部
IPアドレス サポートするIPアドレスのタイプを指定する。dual stackを選択するとIPv4とIPv6の両方をサポート
リスナー ELBで受信するプロトコルやポート、ELBからインスタンスに連携するプロトコルやポートを設定する
アベイラビリティーゾーン ELBを作成するVPCのサブネットを指定
タグ 識別用のタグ

f:id:nogson2:20200507224120p:plain

セキュリティグループを選択

セキュリティグループを選択します。

ルーティングの設定

リクエストを送るターゲットグループを設定します。

ターゲットの登録

ELBに登録するEC2インスタンスを選択します。

f:id:nogson2:20200507232742p:plain

EBLのアクセス分散を確認する

ELBに登録したEC2インスタンスが2つあるとします。
それぞれの/var/www/htmlにindex.htmlファイルをおいて、それぞれに別々の内容のテキストを記載します。

正しくELBの設定が行われていれば、ロードバランサーのDNSでアクセスした際に、それぞれのindex.htmlがリロード時にランダムに表示されます。