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の利用の基礎基礎メモ
こちらに移動しました。
AWS超初心者のメモ ~wordpressを入れてみる その3~
WebサーバーにWordpressをインストール
「AWS超初心者のメモ ~プライベートサブネットにMySQLを入れる その2~ - のぐそんブログ」の続きです。
PHPをインストールする
webサーバーに入る。
$scp -i my-key.pem my-key.pem ec2-user@XX.XXX.XXX.XX
インストールできるPHPを確認
Amazon Linux Extrasを利用する。
Amazon Linux Extrasとは
Extras は、安定したオペレーティングシステムで新しいバージョンのアプリケーションソフトウェアを利用可能にする Amazon Linux 2 のメカニズムで、2023 年 6 月 30 日までサポートされます。Extras は、OS の安定性を確保しつつ、最新のソフトウェアを利用できるようにするうえで役立ちます。例えば、5 年間サポートされる安定したオペレーティングシステムに MariaDB の新しいバージョンをインストールすることができます。Extras の例には、Ansible 2.4.2、memcached 1.5、nginx 1.12、Postgresql 9.6、MariaDB 10.2、Go 1.9、Redis 4.0、R 3.4、Rust 1.22.1 などがあります。
https://aws.amazon.com/jp/amazon-linux-2/faqs/
インストールできるPHPをを確認する。
$sudo amazon-linux-extras list | grep php _ php7.2 available \ _ lamp-mariadb10.2-php7.2 available \ 31 php7.3=latest enabled \ _ php7.4 available [ =stable ]
php7.3をインストール。
$sudo amazon-linux-extras install php7.3
バージョンを確認。
$php -v PHP 7.3.16 (cli) (built: Mar 27 2020 17:33:16) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.16, Copyright (c) 1998-2018 Zend Technologies
wordpressをインストール
rootユーザーに切り替える。
$sudo su -
ディレクトリを移動。
#cd /var/www/html
wordpressをインストール。
#wget http://ja.wordpress.org/latest-ja.zip
zipファイルがあるかを確認。
#ls -la total 13636 drwxr-xr-x 2 root root 27 May 3 09:26 . drwxr-xr-x 4 root root 33 Apr 23 12:28 .. -rw-r--r-- 1 root root 13960734 May 2 02:00 latest-ja.zip
zipファイルを解凍。
#unzip -q latest-ja.zip
解凍した中身をhtml配下に移動。
#cd /var/www/html/wordpress # mv * ..
html配下のファイルを確認。
# ls -la total 13848 drwxr-xr-x 6 root root 4096 May 3 11:43 . drwxr-xr-x 4 root root 33 Apr 23 12:28 .. -rw-r--r-- 1 root root 405 Feb 6 06:33 index.php -rw-r--r-- 1 root root 13960734 May 2 02:00 latest-ja.zip -rw-r--r-- 1 root root 19915 Feb 12 11:54 license.txt -rw-r--r-- 1 root root 10089 May 2 02:00 readme.html drwxr-xr-x 2 root root 6 May 3 11:43 wordpress -rw-r--r-- 1 root root 6912 Feb 6 06:33 wp-activate.php ...
html配下のファイルの所有者・グループをapache/apacheに変更します。
#chown -R apache:apache /var/www/html
wordpressを設定
Apatchを起動
Apatchを起動。
$sudo service httpd start
起動中の場合は再起動。
$sudo service httpd restart
webサーバーを起動後にアクセスするとwordpressの初期設定画面が表示されます。
wordpress用のDBテーブルを作成する
webサーバー(踏み台サーバー)からDBサーバーに接続。
$ssh -i my-key.pem ec2-user@XX.X.X.XX
MySQLに接続。
$mysql -u root -p
データベースを作成。データベース名はwordpress(任意)とします。
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
wordpressデータベースに接続できる一般ユーザを作成します。
mysql> grant all on wordpress.* to wordpress@"%" identified by 'wordpresspassword';
もし以下のエラーが発生した場合は...
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
パスワードを変更するか、以下のコマンドでパスワードのポリシーを変更してください。
mysql> set global validate_password_policy=LOW;
ユーザーの作成が完了いたら、すべての変更を有効にするために以下を実行します。
mysql> FLUSH PRIVILEGES;
作成したユーザーは以下で確認できます。
mysql> select user,host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | wordpress | % | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+
hostが%
になっているものは、すべてのホストから接続することができます。
設定した情報でログインする
webサーバーにアクセスし、登録した情報を入力します。
- データベース名 ・・・ wordpress
- ユーザー名・・・ wordpress
- パスワード・・・wordpresspassword
- データベースのホスト名 10.0.2.10
- テーブルの接頭辞・・・wp_(そのまま)
wordpressのユーザー名やサイト名を設定する。
wordpressにログインするためのユーザー情報などを設定する。
wordpressの管理画面が表示されます。
AWS超初心者のメモ ~プライベートサブネットにMySQLを入れる その2~
AWS超初心者のメモ ~プライベートサブネットにMySQLを入れる その1~の続きです。
DBサーバーにMySQLをインストール
プライベートサブネット内のDBサーバーにMySQLをインストールします。
しかし、DBサーバーはプライベートサブネット内にあるので、インターネットに接続することができません。
この問題を解決する為にNATを利用します。
NATとは
NAT(Network Address Translation)とは、コンピュータネットワークにおいて、主にグローバルIPアドレスをプライベートIPアドレスに、またはその逆の変換を行う技術のことである https://www.atmarkit.co.jp/ait/articles/0401/01/news056.html
NATを利用すると、プライベートサブネットからインターネットに接続できるようになるが、インターネットからプラベートサブネットに接続することはできないです。
NATを構築
NATゲートウェイを構築する
NATゲートウェイはインターネットから接続できるパブリックサブネットに配置する。
VPC > NAT ゲートウェイ > 「NATゲートウェイの作成」を押す
次に、「サブネット」と「Elastic IP 割り当てID」を設定します。
Elastic IP 割り当てIDとは、静的な固定のパブリックIPアドレスのことです。
ルートテーブルを更新する
プライベートサブネットからインターネットに対して通信する場合に、パケットがNATゲートウェイに向かうようにします。
VPC > ルートテーブルから「メイン」が「はい」になっているものを選択。
送信先を0.0.0.0/0
に、ターゲットを先程作成したNATゲートウェイを選択します。
プライベートサブネットからインターネットへの疎通を確認する
DBサーバーにログインして、HTTP、HTTPSで接続できるかを確認します。
[ec2-user@ip-10-0-2-10 ~]$ curl www.nogson.blog
ステータスコードが3xxになる場合は-Lオプションを付与する。
[ec2-user@ip-10-0-2-10 ~]$ curl -L www.nogson.blog
NATゲートウェイは利用しない場合は削除する
NATゲートウェイは、利用しなくなったら削除しておいたほうがよいです。
NTAゲートウェイは稼働時間と転送バイトの両方で課金されてしまうので、通信してなくても料金がかかります。
利用したい場合は、再度つくりなおします。
その際は、NTAゲートウェイのIDも変わるので、ルートテーブルも合わせて変更します。
MySQLをインストール
DBサーバーで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
バージョンを確認する
$mysqld --version mysql Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using EditLine wrapper
起動する。
$sudo service mysqld start
停止する。
$sudo service mysqld stop
起動しているか確認する。
$sudo service mysqld status
DBサーバー起動時にMySQLが自動で起動するようにする。
$ sudo chkconfig mysqld on
MySQLにログイン
MySQL 5.7では初回起動時にrootにランダムなパスワードが割り振らるらしいので、パスワードを確認します。
$ sudo cat /var/log/mysqld.log | grep 'temporary password' 2020-04-26T07:42:38.420478Z 1 [Note] A temporary password is generated for root@localhost: XXXXXXXXXXX
ログインする。
$mysql -u root -p
パスワードを変更しておく。
mysql> SET GLOBAL validate_password_length=8; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL validate_password_policy=LOW; Query OK, 0 rows affected (0.00 sec) mysql> ALTER USER root@localhost IDENTIFIED BY 'my_password'; Query OK, 0 rows affected (0.00 sec)
AWS超初心者のメモ ~プライベートサブネットにMySQLを入れる その1~
プライベートサブネットとは
データベースなど、インターネットから隔離するために利用する、インターネットから接続できないサブネットのことです。
プライベートサブネットを作成する
VPC > サブネットから「サブネットの作成」を押す
プライベートサブネットにサーバーを構築する
EC2 > インスタンス > インスタンスを作成
ステップ3では、VPC領域を選択して、作成いたプライベートサブネットを選択。
IPアドレスはインターネットから接続しないので、自動割当パブリックIPは「無効化」にします。
ステップ6のセキュリティグループでは、MySQLの通信ポートの「3306」を設定する。
送信元は、「任意の場所」を選択する
DBサーバーがWebサーバーからアクセスできるかを確認する
DBサーバーがWebサーバーからアクセスできるかを確認するにはpingコマンドを利用します。 pingコマンドでは「ICMPプロコトル」を利用します。
ICMPがとおるようにする
VPX > セキュリティグループ > インバウンドルール > ルールの編集
ルールの追加 >
タイプ : すべてのICMP
ソース : 任意の場所
pingコマンドを実行
$ping 10.0.2.10
疎通できると以下のようになる。
PING 10.0.2.10 (10.0.2.10) 56(84) bytes of data. 64 bytes from 10.0.2.10: icmp_seq=130 ttl=255 time=0.443 ms 64 bytes from 10.0.2.10: icmp_seq=131 ttl=255 time=0.467 ms
ローカルからWebサーバーにアクセスしてみる
Webサーバーのインスタンスのインバウンドルールも同じようにICMPが通るように設定します。
そのうえで、疎通を確認します。
ping ec2-13-231-207-54.ap-northeast-1.compute.amazonaws.com
疎通できると以下のようになる。
$ ping ec2-13-231-207-54.ap-northeast-1.compute.amazonaws.com PING ec2-13-231-207-54.ap-northeast-1.compute.amazonaws.com (13.231.207.54): 56 data bytes 64 bytes from 13.231.207.54: icmp_seq=0 ttl=236 time=10.718 ms 64 bytes from 13.231.207.54: icmp_seq=1 ttl=236 time=14.337 ms 64 bytes from 13.231.207.54: icmp_seq=2 ttl=236 time=12.168 ms 64 bytes from 13.231.207.54: icmp_seq=3 ttl=236 time=32.455 ms
DBソフトをインストール
SSHでログインして、MySQLをインストールします。
しかしDBサーバーはプライベートサブネットの為、インターネットと接続されていません。
踏み台サーバーを利用してSSH接続
インターネットから接続できるWebサーバーを利用して、DBサーバーにSSH接続します。
手順としては以下のような感じです。
- WebサーバーにSSH接続
- WebサーバーからDBサーバーにSSH接続
WebサーバーからSSH接続
インスタンスにSSH接続するには、秘密鍵が必要です。
WebサーバーからDBサーバーに接続するために、秘密鍵をWebサーバーに置く必要があります。
アップするには以下のようにscpコマンドを利用します。
// scp -i 秘密鍵 アップするファイル ec2-user@{パブリックIP}:アップ先 scp -i my-key.pem my-key.pem ec2-user@{パブリックIP}:~/
秘密鍵をアップしたら、鍵のパーミッションを変更します。
Webサーバーにログインした上で以下のコマンドを実行します。
$chmod 400 my-key.pem
DBサーバーにSSH接続
以下でDBサーバーにログインします。
ssh -i my-key.pem ec2-user@10.0.2.10
つづく