事前準備
EC2 + Ubuntu + LEMP + LaravelのAMIを作成する
Ubuntu 18.04 LTS – Bionicを選択
パッケージの更新
$ sudo apt-get update $ sudo apt -y install software-properties-common $ sudo add-apt-repository ppa:ondrej/php $ sudo apt-get update
PHPのインストール
$ sudo apt-get install php7.4 php7.4-mbstring php7.4-xml php7.4-cli hhvm php7.4-fpm php7.4-mysql -y
$ sudo vi /etc/php/7.4/fpm/pool.d/www.conf user = www-data group = www-data listen.mode = 0660 listen = /var/run/php/php7.4-fpm.sock
$ sudo systemctl restart php7.4-fpm
Nginxインストール
$ sudo apt-get install nginx -y
$ sudo chown -R www-data:www-data /var/www $ sudo chmod -R 0755 /var/www
$ sudo vim /etc/nginx/sites-available/gitlab-cicd-test.yuulinux.tokyo.conf server { listen 80 default_server; listen [::]:80 default_server; root /var/www/product-project/public; index index.php index.html; server_name your_ip_address; location / { try_files $uri $uri/ /index.php?$query_string; } # pass the PHP scripts to FastCGI server # location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } }
$ cd /etc/nginx/sites-enabled $ sudo rm default $ sudo ln -s /etc/nginx/sites-available/gitlab-cicd-test.yuulinux.tokyo.conf $ sudo systemctl restart nginx
MariaDB
$ sudo apt-get install mariadb-server -y
$ sudo su # mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] New password: Re-enter new password: Sorry, you can't use an empty password here. New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] ... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
$ mysql -u root -p > CREATE DATABASE sampleapp; > CREATE USER 'www-data'@'localhost' IDENTIFIED BY 'password'; > GRANT ALL PRIVILEGES ON sampleapp.* TO 'www-data'@'localhost'; > FLUSH PRIVILEGES; > SHOW GRANTS FOR 'ubuntu'@'localhost'; +---------------------------------------------------------------------------------------------------------------+ | Grants for ubuntu@localhost | +---------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'ubuntu'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | | GRANT ALL PRIVILEGES ON `sampleapp`.* TO 'ubuntu'@'localhost' | +---------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
MariaDB [(none)]> exit Bye
# sudo systemctl restart mysql
Ctrl + xを教えてyを選択、そしてEnterを押すと保存される
www-dataにログインできるようにする
$ sudo usermod -s /bin/bash www-data
$ sudo su - www-data
$ mysql -u www-data -p Enter password:password Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 30 Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> exit Bye
www-dataでmysqlにログインできるようになった
$ sudo apt-get install zip unzip -y
$ cd /var/www/html $ sudo rm index.nginx-debian.html
Composerインストール
$ curl -sS https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer
Laravelインストール
$ cd /var/www/ $ composer create-project "laravel/laravel=5.7.*" product-project $ sudo chmod -R 0775 /var/www/product-project/storage $ sudo chown -R www-data:www-data /var/www/product-project/storage
$ cd /var/www/product-project/ $ vi /var/www/product-project/.env ・・・ DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=sampleapp DB_USERNAME=www-data DB_PASSWORD=password ・・・
$ php artisan migrate $ php artisan config:clear
http://IPアドレス/
Laravelが表示された
$ vi /var/www/product-project/resources/views/welcome.blade.php <div> @if(DB::connection()->getDatabaseName()) <p>Database: {{ DB::connection()->getDatabaseName() }}</p> @endif </div>
Database: sampleappが表示された!
OK!
$ vi /var/www/product-project/config/logging.php 'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['single'], 'ignore_exceptions' => false, ], 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', ], ■daily変更 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 14, ], ↓変更 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 30, 'tap' => [ App\Logging\LogProcessor::class, App\Logging\LogFormatter::class ] ], ●追加 'request' => [ 'name' => 'request', 'driver' => 'daily', 'path' => storage_path('logs/request.log'), 'level' => 'debug', 'days' => 30, ], 'query' => [ 'driver' => 'daily', 'path' => storage_path('logs/query.log'), 'level' => 'debug', 'days' => 90 ], ●追加 ここまで 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ],
.env
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:i4mCPefNF12taWlu/ZsE9Aaa+BlxdeS9QaOS4tzTmeU= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack DB_QUERY_LOG=true DEBUG_EXCEPTION=true DEBUG_REQUEST=true DEBUG_LOG=true DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=sampleapp DB_USERNAME=www-data DB_PASSWORD=password BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
クエリログの出力
$ vi /var/www/product-project/app/Providers/AppServiceProvider.php <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 対策 Schema::defaultStringLength(191); // ログ出力 // insert と update と delete の更新処理を確認可能 // tail -f storage/logs/laravel.log | grep -e "0 => 'i" -e "0 => 'u" -e "0 => 'd" if (env('DB_QUERY_LOG', false)) { \DB::listen( function ($query) { $sql = $query->sql; for ($i = 0; $i < count($query->bindings); $i++) { $sql = preg_replace("/\?/", $query->bindings[$i], $sql, 1); } // Query channelのログレベルはdebugになっている \Log::channel('query')->debug( "SQL", ["time" => sprintf("%.2f ms", $query->time), "sql" => $sql] ); } ); } } }
$ vi /var/www/product-project/app/Http/Middleware/RequestLogger.php <?php namespace App\Http\Middleware; use Closure; class RequestLogger { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if (env('DEBUG_REQUEST', false)) { $this->_writeLog($request); } return $next($request); } private function _writeLog($request): void { \Log::channel('request')->debug( $request->method() . " : " . json_encode( ['url' => $request->fullUrl(), 'request' => $request->all(), 'header' => $request->headers->all()], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) ); } }
app/Http/Kernel.php へ追記
protected $middleware = [ // ... 省略 \App\Http\Middleware\RequestLogger::class, ];
/var/www/product-project/routes/web.php <?php use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\DB; use App\User; Route::get('/', function () { $user = DB::transaction(function () { $user = factory(User::class)->create(); $user->name = 'change name'; $user->save(); $user->delete(); return factory(User::class)->create(); }); User::find($user->id); return view('welcome'); }); Route::get('hello', 'HelloController@index');
$ php artisan config:clear $ php artisan cache:clear $ composer dumpa
もくじ
CloudWatch Agentを入れる場合
Kinesis Agentを入れる場合[工事中]
Kinesis Agent
openjdkのバージョン検索
$ sudo apt search openjdk-\(\.\)\+-jre$ Sorting... Done Full Text Search... Done openjdk-11-jre/bionic-updates,bionic-security,now 11.0.8+10-0ubuntu1~18.04.1 amd64 [installed,automatic] OpenJDK Java runtime, using Hotspot JIT openjdk-8-jre/bionic-updates,bionic-security 8u265-b01-0ubuntu2~18.04 amd64 OpenJDK Java runtime, using Hotspot JIT
$ sudo apt install -y default-jre $ git clone https://github.com/awslabs/amazon-kinesis-agent.git $ cd amazon-kinesis-agent $ sudo ./setup --install clean: get-java-version: check-java-version: BUILD FAILED /home/ubuntu/amazon-kinesis-agent/build.xml:29: Unsupported Java version: 11. Make sure that the Java version is 1.8 or greater. Total time: 0 seconds Failed to build the Java project
$ java -version openjdk version "11.0.8" 2020-07-14 OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1) OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1, mixed mode, sharing)
$ sudo apt-get install openjdk-8-jre
$ sudo update-alternatives --config java There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode 1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode Press <enter> to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode
ubuntu@ip-172-31-39-141:~/amazon-kinesis-agent$ java -version openjdk version "1.8.0_265" OpenJDK Runtime Environment (build 1.8.0_265-8u265-b01-0ubuntu2~18.04-b01) OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
$ sudo ./setup --install Detected OS Distro: Ubuntu Uninstalling aws-kinesis-agent ... Removing aws-kinesis-agent from system services... userdel: user 'aws-kinesis-agent-user' does not exist groupdel: group 'aws-kinesis-agent-user' does not exist Installing Kinesis Agent ... Downloading dependencies ... Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar Buildfile: /home/ubuntu/amazon-kinesis-agent/build.xml clean: get-java-version: check-java-version: init: [mkdir] Created dir: /home/ubuntu/amazon-kinesis-agent/ant_build compile: [mkdir] Created dir: /home/ubuntu/amazon-kinesis-agent/ant_build/private BUILD FAILED /home/ubuntu/amazon-kinesis-agent/build.xml:39: Unable to find a javac compiler; com.sun.tools.javac.Main is not on the classpath. Perhaps JAVA_HOME does not point to the JDK. It is currently set to "/usr/lib/jvm/java-8-openjdk-amd64/jre" Total time: 0 seconds Failed to build the Java project
$ sudo apt-get install openjdk-8-jdk
$ sudo ./setup --install BUILD SUCCESSFUL Total time: 7 seconds Configuration file installed at: /etc/aws-kinesis/agent.json Configuration details: { "cloudwatch.emitMetrics": true, "kinesis.endpoint": "", "firehose.endpoint": "", "flows": [ { "filePattern": "/tmp/app.log*", "kinesisStream": "yourkinesisstream", "partitionKeyOption": "RANDOM" }, { "filePattern": "/tmp/app.log*", "deliveryStream": "yourdeliverystream" } ] } Amazon Kinesis Agent is installed successfully. To start the aws-kinesis-agent service, run: sudo service aws-kinesis-agent start To stop the aws-kinesis-agent service, run: sudo service aws-kinesis-agent stop To check the status of the aws-kinesis-agent service, run: sudo service aws-kinesis-agent status aws-kinesis-agent log file will be found at: /var/log/aws-kinesis-agent To make the agent automatically start at system startup, type: sudo chkconfig aws-kinesis-agent on Your installation has completed!
インストール成功!
EC2にIAMロールを作成して割り当てます。
- このロールを使用するサービスを選択:EC2
- ポリシー:AmazonKinesisFirehoseFullAccess
- ロール名:EC2-Kinesis-Full-Role
Data Firehose -> Create delivery stream ->
$ sudo vi /etc/aws-kinesis/agent.json { "cloudwatch.emitMetrics": true, "kinesis.endpoint": "", "firehose.endpoint": "", "flows": [ { "filePattern": "/tmp/app.log*", "kinesisStream": "yourkinesisstream", "partitionKeyOption": "RANDOM" }, { "filePattern": "/tmp/app.log*", "deliveryStream": "yourdeliverystream" } ] } ●↓変更 { "cloudwatch.emitMetrics": false, "firehose.endpoint": "https://firehose.ap-northeast-1.amazonaws.com", "flows": [ { "filePattern": "/var/www/product-project/storage/logs/laravel*", "deliveryStream": "laravel-debug-log" } ] }
$ sudo service aws-kinesis-agent restart