AWSのec2インスタンスを別アカウントのec2で立ち上げる

お客さんから、「EC2でシクヨロ」って言われて自分の環境にEC2立ち上げたら
「あ、AWS契約したからこっちで契約したAWS上でシクヨロ!」
って言われることよくありますよね。いや、ない。

そんな時でも大丈夫。簡単に移設できます。そう、AWSならね。

EC2をまず立ち上げましょう

立ち上げます。
多分PHP+Nginx+php-fpm+mysql+WP+laravelとかですよね。
そのうち、↑をAnsibleで一発で立ち上げるやつ書きます。

お客さんにAWS契約したからこっちでシクヨロ!って言われる

はい、がっかりします。
泣きながらお客さんのAWS環境にログインしましょう。
もちろん、EC2のアクセス権限はもらいましょう。

さっき立ち上げたEC2をAMI化しましょう。

AMI化手順は以下の通り。
移設したいEC2を選択して、

  • アクション>イメージ>イメージの作成

を選択。以下図。

1.png

なんか血しぶきみたいになっちまった:scream:

そして、作成したらこんな画面になるので適当にわかりやすい名前を付けます。

2.PNG

麦茶を飲んで待ってれば出来上がります。
出来たかどうかは左メニューからAMIを選んでみましょう

3.png

はい、順調に作成されていますね。

さあ共有。

ん?見慣れない文字、AWSアカウント番号??

4.png

AWSアカウント番号とは!?

あわてない、あわてない。一休み、一休み。
右上のサポート>サポートセンターを選択するとなんと!見ることが出来ます。
移行先のアカウント番号を入力して、イメージパーミッションの変更は終了です。

5.png

移行先のEC2管理画面を開いてみよう

EC2 > イメージ > AMI を選択してみて下さい。
移行先のEC2管理画面を見てみると、はいありました。
あとはこれを選択して上のほうの作成ボタンを押すとちょっと待てば出来上がり!

この記事で絶望の淵にいた人を一人でも救えるとうれしいな。

続きを読む

AWS + Nginx + PHP + Laravel

nginx + php + LaravelをAWS上に構築してみる

nginx

  • インストールと起動
$ sudo yum -y install nginx
・・・・・
完了しました!

$ sudo service nginx start
Starting nginx:                                            [  OK  ]
  • バージョンやconfigurationの内容を知りたいときは下記コマンド
$ nginx -V
  • configurationで使いそうなやつメモ
設定 説明 デフォルト
–error-log-path HTTPアクセスログのエラーのパス /var/log/nginx/error.log
–http-log-path HTTPアクセスログのパス /var/log/nginx/access.log
–conf-path nginxの設定ファイルのパス /etc/nginx/nginx.conf
–http-proxy-temp-path プロキシを実行している場合、ここで指定したディレクトリが一時ファイルの格納パスになる /var/lib/nginx/tmp/proxy
  • モジュールで気になるところメモあたり(他にもあったけど、メモるの面倒でdown)
モジュール名 説明 利用場面 デフォルト
http_ssl https対応(OpenSSLライブラリが必要)。 プロキシ 有効
http_realip L7ロードバランサなどの後に配置する場合有効にする必要あり。複数のクライアントが同一IPアドレスから通信してくるように見える環境で使用。 プロキシ 有効
http_geoip クライアントのIPアドレスに基づく地理的位置に応じた処理を行うための様々な変数を設定 Web、プロキシ 有効
http_stub_status Nginx自身の統計情報の収集を手助けする Web、プロキシ 有効

※有効化(–with-<モジュール名>module)、無効化(–without-<モジュール名>module)

PHP7のインストール

  • CentOS6用のPHP7のリポジトリを追加(これがないとインストールできないくさい)
$ sudo yum install --enablerepo=webtatic-testing 
                 php70w php70w-devel php70w-fpm php70w-mysql 
                 php70w-mbstring php70w-pdo
  • 他にも必要であればインストールしておく(json系とか)

nginxとphpの紐付け

  • index.phpのセット

    • /var/www/default ディレクトリ作成
    • ここにindex.phpを配置 (最初はとりあえずphpinfoを吐くだけ)
  • /etc/php-fpm.d/www.confの編集 (backupを取った上で編集)
$ diff -uN www.conf.backup_20160710 www.conf
--- www.conf.backup_20160710    2016-07-10 08:00:45.267704077 +0000
+++ www.conf    2016-07-10 08:01:38.451085053 +0000
@@ -5,9 +5,11 @@
 ; Note: The user is mandatory. If the group is not set, the default user's group
 ;       will be used.
 ; RPM: apache Choosed to be able to access some dir as httpd
-user = apache
+; user = apache
+user = nginx
 ; RPM: Keep a group allowed to write in log dir.
-group = apache
+; group = apache
+group = nginx
  • /etc/nginx/nginx.confの編集 (backupを取った上で編集)
$ diff -uN nginx.conf.backup_20160710 nginx.conf
--- nginx.conf.backup_20160710  2016-07-10 07:49:38.694839828 +0000
+++ nginx.conf  2016-07-10 07:59:49.564346085 +0000
@@ -32,13 +32,14 @@
     # for more information.
     include /etc/nginx/conf.d/*.conf;

-    index   index.html index.htm;
+    index   index.php index.html index.htm;

     server {
         listen       80 default_server;
         listen       [::]:80 default_server;
         server_name  localhost;
-        root         /usr/share/nginx/html;
+        #root         /usr/share/nginx/html;
+        root         /var/www/default;

         # Load configuration files for the default server block.
         include /etc/nginx/default.d/*.conf;
@@ -46,8 +47,17 @@
         location / {
         }

-        # redirect server error pages to the static page /40x.html
+        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
         #
+        location ~ .php$ {
+            root           /var/www/default;
+            fastcgi_pass   127.0.0.1:9000;
+            fastcgi_index  index.php;
+            fastcgi_param  SCRIPT_FILENAME  /var/www/default$fastcgi_script_name;
+            include        fastcgi_params;
+        }
+
+        # redirect server error pages to the static page /40x.html
         error_page 404 /404.html;
             location = /40x.html {
         }
@@ -64,16 +74,6 @@
         #    proxy_pass   http://127.0.0.1;
         #}

-        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
-        #
-        #location ~ .php$ {
-        #    root           html;
-        #    fastcgi_pass   127.0.0.1:9000;
-        #    fastcgi_index  index.php;
-        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
-        #    include        fastcgi_params;
-        #}
-
  • 再起動して、phpinfoページが見れればOK (http://<>)
$ sudo service php-fpm start
Starting php-fpm:                                          [  OK  ]
$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
  • ついでにサーバ起動時などに自動で起動するものも設定
$ sudo chkconfig nginx on
$ sudo chkconfig php-fpm on

nginxとphp-fpmの接続をsocketにする

  • php-fpmの設定変更
$ diff -uN www.conf.backup_20160710 www.conf
--- www.conf.backup_20160710    2016-07-10 08:00:45.267704077 +0000
+++ www.conf    2016-07-10 08:19:03.630366042 +0000
@@ -19,7 +21,8 @@
 ;                            (IPv6 and IPv4-mapped) on a specific port;
 ;   '/path/to/unix/socket' - to listen on a unix socket.
 ; Note: This value is mandatory.
-listen = 127.0.0.1:9000
+; listen = 127.0.0.1:9000
+listen = /var/run/php-fpm/php-fpm.sock

@@ -32,6 +35,8 @@
 ;                 mode is set to 0660
 ;listen.owner = nobody
 ;listen.group = nobody
+listen.owner = nginx
+listen.group = nginx
 ;listen.mode = 0660
  • nginxの設定変更
$ diff -uN nginx.conf.backup_20160710 nginx.conf
--- nginx.conf.backup_20160710  2016-07-10 07:49:38.694839828 +0000
+++ nginx.conf  2016-07-10 08:20:37.741301066 +0000
@@ -46,8 +47,17 @@
-            fastcgi_pass   127.0.0.1:9000;
+            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
  • 再起動
$ sudo service php-fpm restart
Stopping php-fpm:                                          [  OK  ]
Starting php-fpm:                                          [  OK  ]
$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

Laravel5を入れてみる

  • Composerをインストール
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv /home/ec2-user/composer.phar /usr/local/bin/composer
  • Laravelのインストール
$ sudo /usr/local/bin/composer global require "laravel/installer"
Changed current directory to /root/.composer
Using version ^1.3 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing symfony/process (v3.1.2)
    Downloading: 100%         

  - Installing symfony/polyfill-mbstring (v1.2.0)
    Downloading: 100%         

  - Installing symfony/console (v3.1.2)
    Downloading: 100%         

  - Installing guzzlehttp/promises (1.2.0)
    Downloading: 100%         

  - Installing psr/http-message (1.0)
    Downloading: 100%         

  - Installing guzzlehttp/psr7 (1.3.1)
    Downloading: 100%         

  - Installing guzzlehttp/guzzle (6.2.0)
    Downloading: 100%         

  - Installing laravel/installer (v1.3.3)
    Downloading: 100%         

symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
  • php-xmlのインストール (laravelで必要になる)
$ sudo yum install --enablerepo=webtatic-testing php70w-xml
  • プロジェクト作成
$ pwd
/var/www/default
$ sudo /usr/local/bin/composer create-project --prefer-dist laravel/laravel darmaso
Installing laravel/laravel (v5.2.31)
  - Installing laravel/laravel (v5.2.31)
    Downloading: 100%         

Created project in darmaso
> php -r "copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
・・・・・ (下記の結果と同じ)

$ cd darmaso
$ sudo /usr/local/bin/composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
・・・・・
Writing lock file
Generating autoload files
> IlluminateFoundationComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader

※php-xmlをインストールしておかないと、下記のようなエラーが出るので注意
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - phpunit/phpunit 4.8.9 requires ext-dom * -> the requested PHP extension dom is missing from your system.
・・・・・
    - Installation request for phpunit/phpunit ~4.0 -> satisfiable by phpunit/phpunit[4.0.0, 4.0.1, 4.0.10, 4.0.11, 4.0.12, 4.0.13, 4.0.14, 4.0.15, 4.0.16, 4.0.17, 4.0.18, 4.0.19, 4.0.2, 4.0.20, 〜
・・・・・
  To enable extensions, verify that they are enabled in those .ini files:
    - /etc/php.ini
    - /etc/php.d/bz2.ini
    - /etc/php.d/calendar.ini
・・・・・
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
  • Applicationキーの生成 (composerでインストールした場合セットされているらしいが念のため)
$ sudo php artisan key:generate
Application key [base64:YVeCf2A+5IjUbk2qVL4HhPiecBdYuo8irJrEYjJKZWY=] set successfully.
  • Laravel用にnginx設定を修正し、再起動
$ diff -uN nginx.conf.backup_20160710 nginx.conf
+        #root         /var/www/default;
+        root         /var/www/default/darmaso/public;
・・・・・
         location / {
+            try_files $uri $uri/ /index.php?$query_string;
         }
・・・・・
+            #root           /var/www/default;
+            root           /var/www/default/darmaso/public;
・・・・・
+            #fastcgi_param  SCRIPT_FILENAME  /var/www/default$fastcgi_script_name;
+            fastcgi_param  SCRIPT_FILENAME  /var/www/default/darmaso/public$fastcgi_script_name;

$ sudo service php-fpm restart
$ sudo service nginx restart
  • これで動作確認するとエラーになるので下記の設定をしてみる
$ sudo chmod -R 777 storage/
$ sudo chmod -R 777 vendor/

※本来は、サーバアカウントをちゃんと定義してやるべきだが、今回は試しなのでこのままでOKとする

  • 一部の設定を変えてみる
config/app.php
$ diff -uN config/app.php.backup_20160710 config/app.php
--- config/app.php.backup_20160710  2016-07-10 09:37:07.881735079 +0000
+++ config/app.php  2016-07-10 09:40:54.263419145 +0000
@@ -52,7 +52,7 @@
     |
     */

-    'timezone' => 'UTC',
+    'timezone' => 'Asia/Tokyo',

     /*
     |--------------------------------------------------------------------------
@@ -65,7 +65,7 @@
     |
     */

-    'locale' => 'en',
+    'locale' => 'jp',

     /*
     |--------------------------------------------------------------------------
@@ -78,7 +78,7 @@
     |
     */

-    'fallback_locale' => 'en',
+    'fallback_locale' => 'jp',

これで構築した環境にアクセスしたところ、無事いけました!
設定内容が荒いところもありますが、上記まででPHP+Nginx自体はいけちゃいますね。

Nginxの設定はあまり大したことはできませんでしたが、今後は色々と勉強してみようと思いますmm

参考

続きを読む

MySQLが統計情報を計算するタイミングで再起動してしまう

対象バージョン

MySQL 5.6.35, 5.7.17

現象

AWS より RDS 上の MySQL のうち 5.6.19a, 5.6.19b, 5.6.21, 5.6.21b, 5.6.22, and 5.6.23 の各バージョンが廃止となるという連絡があり、その時点での最新バージョンである 5.6.35 にアップデートを実施した。
するとバージョンアップ後しばらくして以下のエラーが発生し、断続的に再起動を繰り返すようになってしまった。
(ログは一部改変しています)

terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check
06:01:31 UTC - mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed, 
something is definitely wrong and this may fail.
key_buffer_size=xxxxxxxx
read_buffer_size=xxxxxxxx
max_used_connections=xxxx
max_threads=xxxx
thread_count=xxxx
connection_count=xxxx
It is possible that mysqld could use up to 
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = xxxxxx K bytes of memory
Hope that's ok; if not, decrease some variables in the equation.
Thread pointer: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 0 thread_stack 0x40000
/rdsdbbin/mysql/bin/mysqld(my_print_stacktrace+0x33)[0x876d73]
/rdsdbbin/mysql/bin/mysqld(handle_fatal_signal+0x35c)[0x64089c]
/lib64/libpthread.so.0(+0x10f90)[0x7fecc63d2f90]
/lib64/libc.so.6(gsignal+0x37)[0x7fecc57e8167]
/lib64/libc.so.6(abort+0x16a)[0x7fecc57e95ea]
/usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x16d)[0x7fecc60e017d]
/usr/lib64/libstdc++.so.6(+0x73fc6)[0x7fecc60ddfc6]
/usr/lib64/libstdc++.so.6(+0x74011)[0x7fecc60de011]
/usr/lib64/libstdc++.so.6(+0x74228)[0x7fecc60de228]
/usr/lib64/libstdc++.so.6(_ZSt20__throw_out_of_rangePKc+0x139)[0x7fecc613e869]
/rdsdbbin/mysql/bin/mysqld[0xa8e394]
/rdsdbbin/mysql/bin/mysqld[0xa8fb59]
/rdsdbbin/mysql/bin/mysqld[0xa90ec0]
/lib64/libpthread.so.0(+0x7f18)[0x2ada4e15bf18]
/lib64/libc.so.6(clone+0x6d)[0x2ada4f2a5b2d]
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
…

原因

以下 URL にある通り、MySQL の 5.6.35, 5.7.17 でのみ発生するバグとのこと。
https://bugs.mysql.com/bug.php?id=84940

対応

以下2つの対応方法がある。

1. 問題のあるバージョンを回避する

次のバージョンで FIX されているため、5.6.36, 5.7.18 以降のバージョンにアップデートすればよい。

ただ、RDS の場合はちょっと厄介で、2017/8/14 の時点では 5.7.18 以降を選択できないため、5.7.17 になっている場合はダウングレードが必要となってしまう。
(問題の発生した環境は運良く 5.6.35 だったので、5.7.16 にバージョンアップをすることで回避できた)

RDS は現在より前のバージョンを選択できず、スナップショットからの復元でもバージョンは選択できないので、新たにインスタンスを立ち上げて、そこにデータを流し込む方法になると思われる。

2. インデックス統計を永続化しない

前述の URL によると、削除行のインデックス統計判定の不具合(※MariaDBでの修正箇所です)が原因とのこと。
なので、クエリパラメータより以下の設定をすればよいらしい。

[mysqld]
innodb-stats-persistent             = 0
innodb-stats-transient-sample-pages = 20
innodb-stats-auto-recalc            = 0

ただし、この変更によりインデックス統計が非永続的になり、性能劣化が予測されるため、今回は選択しなかった。

備考

MySQL 5.6 と 5.7 の互換性に注意が必要である。
ハマったところで言うと、以下の2つ。

  • sql_mode の ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE がデフォルトで ON
  • ROW_FORMAT=FIXED が廃止

RDS の場合は新しいパラメータグループを作成するが、複数のパラメータグループを比較できるので、それを利用すれば分かりやすいかもしれない。

スクリーンショット 2017-08-15 11.40.15.png

character_set_server を latin1 から utf8mb4 にしなければいけないのもここで気づくことができた。

続きを読む

AWS EC2にLAMP環境を構築するまで

AWS EC2にLAMP環境を構築したときのメモです。
DBも、RDSを使用せずにEC2に入れてます。

作りたい環境

  • Amazon Linux
  • Apache2.4
  • MySQL 5.6
  • PHP7

前提

  • EC2インスタンスが起動している
  • ターミナルからSSHでログインできる

手順

必要なものをインストール

ログイン

~ $ ssh -i .ssh/your_key.pem ec2-user@{インスタンスのIP}

yumアップデート

[ec2-user@ip-***** ~]$ sudo yum update -y

Apache、MySQL、PHP、MySQLドライバのインストール

[ec2-user@ip-***** ~]$ sudo yum install -y httpd24 php70 mysql56-server php70-mysqlnd

Apache、PHP、MySQLのバージョン確認

# Apache
[ec2-user@ip-***** ~]$ httpd -v
Server version: Apache/2.4.25 (Amazon)
Server built:   Jan 19 2017 16:55:49

# PHP
[ec2-user@ip-***** ~]$ php -v
PHP 7.0.16 (cli) (built: Mar  6 2017 19:45:42) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

# MySQL
[ec2-user@ip-***** ~]$ sudo service mysqld start
...
...
...
Starting mysqld:                                           [  OK  ]

[ec2-user@ip-***** ~]$ mysql --version
mysql  Ver 14.14 Distrib 5.6.36, for Linux (x86_64) using  EditLine wrapper

Apacheの設定

起動・スタートページの表示

# サービス開始 (起動はするが ServerNameを設定してください と出る(一旦スルー))
[ec2-user@ip-***** ~]$ sudo service httpd start
Starting httpd: AH00557: httpd: apr_sockaddr_info_get() failed for ip-******
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
                                                           [  OK  ]
#ブラウザで EC2のIPアドレスにアクセスして、Apaceのスタートページが表示されることを確認する

# ドキュメントルートの確認
[ec2-user@ip-***** ~]$ sudo cat /etc/httpd/conf/httpd.conf | less

# 「/DocumentRoot」 で検索
DocumentRoot "/var/www/html"

# 起動設定
[ec2-user@ip-***** ~]$ sudo chkconfig httpd on

# 確認 (2, 3, 4, 5がONになっていればOK)
[ec2-user@ip-***** ~]$ chkconfig
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

グループ設定

# ec2-user を apache グループに追加
[ec2-user@ip-***** ~]$ sudo usermod -a -G apache ec2-user

# 一旦ログアウトして再度ログイン
[ec2-user@ip-***** ~]$ groups
ec2-user wheel apache

# /var/www以下の権限確認
[ec2-user@ip-***** ~]$ ls -l /var/www/
total 20
drwxr-xr-x 2 root root 4096 Jan 19 16:56 cgi-bin
drwxr-xr-x 3 root root 4096 Jun 26 06:18 error
drwxr-xr-x 2 root root 4096 Jan 19 16:56 html
drwxr-xr-x 3 root root 4096 Jun 26 06:18 icons
drwxr-xr-x 2 root root 4096 Jun 26 06:18 noindex

# apacheグループに /var/www 所有・書き込み権限付与
[ec2-user@ip-***** ~]$ sudo chown -R ec2-user:apache /var/www
[ec2-user@ip-***** ~]$ sudo chmod 2775 /var/www/

# /var/www 以下のディレクトリの権限変更
[ec2-user@ip-***** ~]$ find /var/www -type d -exec sudo chmod 2775 {} ;

# /var/www 以下のファイルの権限変更
[ec2-user@ip-***** ~]$ find /var/www -type f -exec sudo chmod 0664 {} ;

httpd.confの設定

/etc/httpd/conf/httpd.conf.conf
# サーバ管理者メールアドレス 変更 87行目あたり
ServerAdmin your_email@example.com

# サーバ名 (ドメイン設定してから)

# クロスサイトトレーシング対策 追記
TraceEnable Off

# ディレクトリ一覧を非表示 変更 145行目あたり
Options -Indexes FollowSymLinks

# cgi-bin使用しない 248〜260行目あたり
#    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

#<Directory "/var/www/cgi-bin">
#    AllowOverride None
#    Options None
#    Require all granted
#</Directory>

security.confの設定(新規作成)

/etc/httpd/conf.d/security.conf
ServerTokens Prod
Header unset X-Powered-By
# httpoxy 対策
RequestHeader unset Proxy
# クリックジャッキング対策
Header append X-Frame-Options SAMEORIGIN
# XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
# XST対策
TraceEnable Off

<Directory /var/www/html>
    # .htaccess の有効化
    AllowOverride All
    # ファイル一覧出力の禁止
    Options -Indexes
</Directory>

Welcomeページ非表示

/etc/httpd/conf.d/welcome.conf 中身をコメントアウト

Apache再起動

[ec2-user@ip-***** ~]$ sudo service httpd restart

phpinfoの設置

[ec2-user@ip-***** ~]$ vi /var/www/html/phpinfo.php
<?php
    echo phpinfo();
?>
# ブラウザで IPアドレス/phpinfo.php にアクセス
# 確認後、phpinfo.phpを削除
[ec2-user@ip-***** ~]$ rm /var/www/html/phpinfo.php

PHP設定

[ec2-user@ip-***** ~]$ sudo cp /etc/php.ini /etc/php.ini.org
/etc/php.ini
# タイムゾーン設定
- ;date.timezone =
+ date.timezone = Asia/Tokyo

# 日本語設定
- ;mbstring.internal_encoding =
+ mbstring.internal_encoding = UTF-8

- ;mbstring.language = Japanese
+ mbstring.language = Japanese

- ;mbstring.http_input =
+ mbstring.http_input = auto

- ;bstring.detect_order = auto
+ bstring.detect_order = auto

MySQLの設定

起動設定

[ec2-user@ip-***** ~]$ sudo chkconfig mysqld on

初期設定

[ec2-user@ip-***** ~]$ sudo mysql_secure_installation
...
...
Enter current password for root (enter for none):
# Enterキー

Set root password? [Y/n]
# rootのパスワードを変更するか。
# Y

New password:
# 任意のパスワード入力

Re-enter new password:
# もう一度入力

Password updated successfully!

Remove anonymous users? [Y/n]
# 匿名ユーザーを削除するかどうか。
# Y

Disallow root login remotely? [Y/n]
# rootユーザーのリモートホストからのログインを無効化するかどうか。
# Y

Remove test database and access to it? [Y/n]
# testデータベースを削除するか。
# Y

Reload privilege tables now? [Y/n]
# これらの変更を即座に反映するか。
# Y

...
Thanks for using MySQL!

Cleaning up...

mysqlへログイン

[ec2-user@ip-***** ~]$ mysql -u root -p
Enter password:
# 初期設定で設定したパスワード

Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 14
Server version: 5.6.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
...
mysql>

アプリケーション用データベース追加

# 現在の状態を確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

# データベース「test_app_db」を追加
mysql> create database test_app_db character set utf8;

# 確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test_app_db  |
+--------------------+

アプリケーションユーザ追加

# 現在のユーザ設定確認
mysql> select Host, User, Password  from mysql.user;
+-----------+------+-------------------------------------------+
| Host      | User | Password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *1234567890ABCDEFGHIJ0987654321KLMNOPQRST|
| 127.0.0.1 | root | *1234567890ABCDEFGHIJ0987654321KLMNOPQRST|
| ::1       | root | *1234567890ABCDEFGHIJ0987654321KLMNOPQRST|
+-----------+------+-------------------------------------------+

# ユーザ「app_user」を追加 (ユーザ名は16文字以内)
mysql> create user 'app_user'@'localhost' identified by  '任意のパスワード';

# データベース「test_app_db」にのみアクセス可能
# 権限は、ALL
mysql> grant ALL on test_app_db.* to 'app_user'@'localhost';

# 設定の反映
mysql> flush privileges;

# 権限の確認
mysql> show grants for 'app_user'@'localhost';
+--------------------------------------------------------------------------------------------------------------------+
| Grants for app_user@localhost                                                                                   |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_user'@'localhost' IDENTIFIED BY PASSWORD '*ABCDEFGHIJ0987654321KLMNOPQRST1234567890' |
| GRANT ALL PRIVILEGES ON `test_app_db`.* TO 'app_user'@'localhost'                                         |
+--------------------------------------------------------------------------------------------------------------------+

#  ログアウト
mysql> quit
Bye

# アプリケーションユーザでログイン
[ec2-user@ip-***** ~]$ mysql -u app_user -p

# データベースの確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test_app_db  |
+--------------------+

mysql> quit

phpMyAdminのインストール

# 「EPEL」リポジトリ有効化
[ec2-user@ip-***** ~]$ sudo yum-config-manager --enable epel

# phpMyAdminインストール
[ec2-user@ip-***** ~]$ sudo yum install -y phpMyAdmin

# エラーになった
Error: php70-common conflicts with php-common-5.3.29-1.8.amzn1.x86_64
Error: php56-common conflicts with php-common-5.3.29-1.8.amzn1.x86_64
Error: php56-process conflicts with php-process-5.3.29-1.8.amzn1.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

# 手動でインストール
[ec2-user@ip-***** ~]$ cd /var/www/html
[ec2-user@ip-*****  html]$ sudo wget https://files.phpmyadmin.net/phpMyAdmin/4.6.6/phpMyAdmin-4.6.6-all-languages.tar.gz
[ec2-user@ip-*****  html]$ sudo tar xzvf phpMyAdmin-4.6.6-all-languages.tar.gz
[ec2-user@ip-*****  html]$ sudo mv phpMyAdmin-4.6.6-all-languages phpMyAdmin
[ec2-user@ip-*****  html]$ sudo rm phpMyAdmin-4.6.6-all-languages.tar.gz
[ec2-user@ip-*****  html]$ cd phpMyAdmin
[ec2-user@ip-*****  phpMyAdmin]$ sudo cp config.sample.inc.php config.inc.php

# IPアドレス/phpMyAdmin でアクセス
# PHPの「mbstring」拡張が無いというエラーが出るのでインストール
[ec2-user@ip-***** ~]$ sudo yum install -y php70-mbstring

# Apace再起動
[ec2-user@ip-***** ~]$ sudo service httpd restart

# .htaccessでphpMyAdminへのアクセス制限
[ec2-user@ip-*****  phpMyAdmin]$ sudo vi .htaccess

order deny,allow
deny from all
allow from **.***.***.***

# ブラウザで [IPアドレス]/phpMyAdmin にアクセスしてログインできるか確認

phpMyAdminの環境保護領域設定

ブラウザでアクセスした際、画面下に「phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。」というメッセージが表示されていた場合、初期設定が必要。


# rootアカウントでログインする
# phpMyAdminのディレクトリ内にある create_tables.sql を流す
# /phpMyAdmin/sql/create_tables.sql

# アプリケーションユーザに phpMyAdminテーブルへのアクセス権を付与する
[ec2-user@ip-***** ~]$ mysql -u root -p

# 現在の権限確認
mysql> show grants for 'app_user'@'localhost';
+--------------------------------------------------------------------------------------------------------------------+
| Grants for app_user@localhost                                                                                   |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_user'@'localhost' IDENTIFIED BY PASSWORD '*ABCDEFGHIJ0987654321KLMNOPQRST1234567890' |
| GRANT ALL PRIVILEGES ON `test_app_db`.* TO 'app_user'@'localhost'                                         |
+--------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

# select, insert, update ,deleteの権限を付与
mysql> grant select, insert, update, delete on phpmyadmin.* to 'app_user'@'localhost';

# 設定を反映
mysql> flush privileges;

# 確認
mysql> show grants for 'app_user'@'localhost';
+--------------------------------------------------------------------------------------------------------------------+
| Grants for app_user@localhost                                                                                   |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_user'@'localhost' IDENTIFIED BY PASSWORD '*ABCDEFGHIJ0987654321KLMNOPQRST1234567890' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `phpmyadmin`.* TO 'app_user'@'localhost'                                |
| GRANT ALL PRIVILEGES ON `test_app_db`.* TO 'app_user'@'localhost'                                         |
+--------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

# config.inc.php の編集
[ec2-user@ip-***** ~]$ sudo vi /var/www/html/phpMyAdmin/config.inc.php
# 以下の記述のコメントアウトを解除する
/* Storage database and tables */
// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
// $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
// $cfg['Servers'][$i]['relation'] = 'pma__relation';
// $cfg['Servers'][$i]['table_info'] = 'pma__table_info';
// $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
// $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
// $cfg['Servers'][$i]['column_info'] = 'pma__column_info';
// $cfg['Servers'][$i]['history'] = 'pma__history';
// $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
// $cfg['Servers'][$i]['tracking'] = 'pma__tracking';
// $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
// $cfg['Servers'][$i]['recent'] = 'pma__recent';
// $cfg['Servers'][$i]['favorite'] = 'pma__favorite';
// $cfg['Servers'][$i]['users'] = 'pma__users';
// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
// $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
// $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
// $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
// $cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
// $cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';

設定ファイル用パスフレーズの設定

ログイン時に「設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。」というメッセージが表示されている場合、設定ファイルにパスフレーズを追記する必要がある。


[ec2-user@ip-***** ~]$ sudo vi /var/www/html/phpMyAdmin/config.inc.php

# 下記の部分に任意の文字列(32文字以上)を入力
/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

パスワード自動生成

その他

時刻設定

[ec2-user@ip-***** ~]$ sudo vi /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false

[ec2-user@ip-***** ~]$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime
[ec2-user@ip-***** ~]$ sudo /etc/init.d/crond restart
[ec2-user@ip-***** ~]$ date
Tue Jun 27 10:20:25 JST 2017

git

[ec2-user@ip-***** ~]$ sudo yum install -y git
[ec2-user@ip-***** ~]$ git --version
git version 2.7.5

composer

[ec2-user@ip-***** ~]$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 1.4.2) successfully installed to: /home/ec2-user/composer.phar
Use it: php composer.phar

[ec2-user@ip-***** ~]$ sudo mv composer.phar /usr/local/bin/composer

[ec2-user@ip-***** ~]$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ / __ `__ / __ / __ / ___/ _ / ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
____/____/_/ /_/ /_/ .___/____/____/___/_/
                    /_/
Composer version 1.4.2 2017-05-17 08:17:52

参考URL

続きを読む

DynamoDBで件数だけ取得するサンプル

PHP

準備

  • aws.pharをダウンロード

https://github.com/aws/aws-sdk-php/releases

今回(2017/08/04)のバージョンは、Version 3.32.3

サンプル

下記を設定する。

  • REGION
  • KEY
  • SECRET
  • TABLE NAME
  • INDEX NAME(必要な場合)
  • SEARCH KEY 検索するキー
  • SERCH VALUE 検索する値

aws.pharと同じディレクトリに置いた。

dynamo_count.php
<?php

require_once('aws.phar');

use AwsDynamoDbDynamoDbClient;
use AwsDynamoDbExceptionDynamoDbException;

$client = new DynamoDbClient(array(
  'version' => 'latest',
  'region'  => '<REGION>',
  'credentials' => [
    'key'     => '<KEY>',
    'secret'  => '<SECRET>',
  ]
));

$result_count = 0;
$LastEvaluatedKey = null;

do {
  $arg = array(
    'TableName' => '<TABLE NAME>',
    'Select' => 'COUNT',
    'ScanIndexForward' => false,
    'IndexName' => '<INDEX NAME>', // 必要な場合のみ
    'KeyConditions' => array(
      '<SEARCH KEY>' => array(
        'AttributeValueList' => array(
          array('S'=>'<SEARCH VALUE>') // Sの場合
        ),
        'ComparisonOperator' => 'EQ'
      ),
    ),
  );

  if($LastEvaluatedKey){
    $arg['ExclusiveStartKey'] = $LastEvaluatedKey;
  }

  $result = $client->query($arg);

  $result_count = $result_count + $result['Count'];
  $LastEvaluatedKey = $result['LastEvaluatedKey'];

} while ($LastEvaluatedKey);

print_r($result_count);

結果は1MB制限があるので、ExclusiveStartKeyを指定して繰り返して取らないと正しい値が取れない。

実行

$ php dynamo_count.php

Scanの場合

scanの時は、下記の部分を変更

$arg = array(
    'TableName' => '<TABLE NAME>',
    'Select' => 'COUNT',
    'ScanIndexForward' => false,
  );
$result = $client->scan($arg);

AWS CLI

上記のオプションとちょっと違うけどメモ的に書いておく。

$ aws dynamodb --profile <PROFILE> query --table-name <TABLE NAME> --key-condition-expression "#key = :key" --expression-attribute-names '{"#key": "<SEARCH KEY>"}' --expression-attribute-values '{":key": {"S":"<SEARCH VALUE>"}}' --index-name <INDEX NAME> --select COUNT
$ aws dynamodb --profile <PROFILE> scan --table-name <TABLE NAME> --select COUNT

こんなのが返ってきます。

{
    "Count": <件数>,
    "ScannedCount": <件数>,
    "ConsumedCapacity": null
}

続きを読む

AMIMOTO AMI でアップロードファイルの上限サイズを変更する

0.はじめに

以前、

AMIMOTO AMI を使って WordPress を立ち上げたんですが、

その続きというか、なんというか…

1.AMIMOTO AMI でアップロードファイルの上限サイズを変更する

  1. 以下のサイトを参考に、関係する chef のファイルを探します。

    すると、
    以下のものが引っかかりました。

    • /opt/local/chef-repo/cookbooks/amimoto/attributes/
    01_web_server.rb.ORG:default[:nginx][:config][:client_max_body_size] = '4M'
    03_php.rb:default[:php][:config][:upload_max_filesize] = node[:nginx][:config][:client_max_body_size]
    03_php.rb:default[:php][:config][:post_max_size] = node[:php][:config][:upload_max_filesize]
    

     

  2. chef 関連の設定ファイルを修正します。

    • /opt/local/chef-repo/cookbooks/amimoto/attributes/01_web_server.rb
    $ diff 01_web_server.rb.ORG 01_web_server.rb
    29c29
    < default[:nginx][:config][:client_max_body_size] = '4M'
    ---
    > default[:nginx][:config][:client_max_body_size] = '10M'
    

  3. 現状の各種設定ファイルを修正します。

    • /etc/nginx/nginx.conf
    $ diff /etc/nginx/nginx.conf.ORG /etc/nginx/nginx.conf
    43c43
    <     client_max_body_size    4M;
    ---
    >     client_max_body_size    10M;
    
    • /etc/php.ini
    $ diff /etc/php.ini.bak201707281842 /etc/php.ini
    52c52
    < upload_max_filesize = 4M
    ---
    > upload_max_filesize = 10M
    

99.ハマりポイント

  • chef の設定の反映タイミングがよくわからないので、ちょっと調べないといけないかな、と思っています。サーバの再起動時は必ず反映されると思うんですが、それ以外にも反映されたりする気がするんですよね…。ちょっとよくわからないので、どこかで調べて投稿しようかと思っています。

XX.まとめ

特に無いです。

ありがとうございました。

続きを読む