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でアクセス。
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 日本語ドキュメント
使い方がよくわかりませんでしたが、値の変化をなめらかにするときに便利だったのでメモしておきます。
サンプルの動きとしてはこんな感じです。
ポイントはLag SOPのTime Slice
をONにすることです。
AWS ELBの基礎基礎メモ
ELB(Elastic Load Balancing)について
ELBとは
アクセスを複数のEC2インスタンスに負荷分散する役割を担います。
またヘルスチェックを行い、複数あるインスタンスの中から正常なインスタンスのみに振り分けます。
ELBにはALB(Application Load Balancer)と、NLB(Network Load Balancer)があります。
利用目的
負荷分散、単一障害点対応
一般的な利用目的としては、大量のアクセスを複数のインスタンスで処理する負荷分散と、特定のインスタンスに障害が発生した場合にサービスを止めない可用性の担保になります。
仮にEC2がダウンした場合。
サービスの継続ができなくなる。
ELBを利用してサイトを冗長化した場合は、仮に1台がダウンしてもサービスの継続が可能。
SSLターミネーション
ELBにHTTPS通信で使用するSSL証明書をアタッチすることで、通信の暗号化・復号も担ってくれます。
その為、ELB配下のインスタンスで暗号化・復号をやならくてよいのでインスタンスの負荷を軽減することができます。
※ SSL証明者はACM(AWS Certificate Manager)で無料で作成することができます
ヘルスチェック
登録されているインスタンスの状態を監視することができます。 正常に動作していないインスタンスはELBの対象から切り離されます。
ELBの作成
「EC2 > ロードバランサー > ロードバランサーの作成」を押します。
ロードバランサーの種別を選択します。
Application Loadを選択します。
ロードバランサーの設定をします。
項目 | 設定 |
---|---|
名前 | 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のサブネットを指定 |
タグ | 識別用のタグ |
セキュリティグループを選択
セキュリティグループを選択します。
ルーティングの設定
リクエストを送るターゲットグループを設定します。
ターゲットの登録
ELBに登録するEC2インスタンスを選択します。
EBLのアクセス分散を確認する
ELBに登録したEC2インスタンスが2つあるとします。
それぞれの/var/www/html
にindex.htmlファイルをおいて、それぞれに別々の内容のテキストを記載します。
正しくELBの設定が行われていれば、ロードバランサーのDNSでアクセスした際に、それぞれのindex.htmlがリロード時にランダムに表示されます。
AWS CLIの利用の基礎基礎メモ
こちらに移動しました。