EC2 Linuxを使いこなす方法をまとめました(Apache、Laravel)

## はじめに
EC2を使いこなしたいが、LinuxやApache、Larabelの知識に自信がないので、実際にどのように使うのかを確認しながら、学びたいという人向けにコンテンツを整理してみました。私自身、久しぶりに内容を整理してみた所、正規表現の使い方やLinuxの基礎を学びなおす事が出来て、勉強になりました。Linuxの使い方にも熟練しており、EC2を使いこなせているという自信をお持ちの方は、読み流してやってくださいませ。

### 目次

2. [EC2の用途](#ec2の用途)
3. [EC2インスタンスを起動する際に、自動的に実行されるユーザーデータを設定する方法](#ec2インスタンスを起動する際に自動的に実行されるユーザーデータを設定する方法)
[ユーザーデータスクリプト](#ユーザーデータスクリプト)
4. [EC2にApacheをインストールする手順](#ec2にapacheをインストールする手順)
5. [Linuxコマンド OS、ネットワーク](#linuxコマンド-osネットワーク)
6. [Linuxコマンド ファイル操作](#linuxコマンド-ファイル操作)
7. [Linuxコマンド 定番](#linuxコマンド-定番)
8. [viエディタ](#viエディタ)
9. [ファイル表示](#ファイル表示)
10. [Linuxの一般的なディレクトリ構造](#linuxの一般的なディレクトリ構造)
11. [Laravel](#laravel)
12. [Laravelを使うための事前準備](#laravelを使うための事前準備)
13. [LaravelアプリケーションをEC2インスタンスにデプロイする](#laravelアプリケーションをec2インスタンスにデプロイする)
14. [Laravelの.envファイルの設定例](#laravelのenvファイルの設定例)
15. [LaravelのストレージにS3を使用する場合](#laravelのストレージにs3を使用する場合)



---


### EC2の用途

| 用途 | 説明 |
|------|------|
| **Webサーバー** | EC2上にWebサーバーを構築することができます。ApacheやNginxなどのWebサーバーソフトウェアをインストールし、WebサイトやWebアプリケーションをホストすることができます。 |
| **データベースサーバー** | EC2上にデータベースサーバーを構築することができます。MySQLやPostgreSQLなどのデータベースソフトウェアをインストールし、データベースをホストすることができます。 |
| **アプリケーションサーバー** | EC2上にアプリケーションサーバーを構築することができます。JavaやRuby、Pythonなどの言語で書かれたアプリケーションを実行するためのサーバーを構築することができます。 |
| **バッチ処理サーバー** | EC2上にバッチ処理サーバーを構築することができます。定期的に実行されるジョブやバッチ処理を実行するためのサーバーを構築することができます。 |
| **分散処理サーバー** | EC2上に分散処理サーバーを構築することができます。HadoopやSparkなどの分散処理フレームワークをインストールし、大規模なデータ処理を行うためのサーバーを構築することができます。 |
| **VPNサーバー** | EC2上にVPNサーバーを構築することができます。OpenVPNなどのVPNソフトウェアをインストールし、安全なリモートアクセスを提供するためのサーバーを構築することができます。 |

### EC2インスタンスを起動する際に、自動的に実行されるユーザーデータを設定する方法
#### ユーザーデータスクリプト
```bash
#!/bin/bash
# ホスト名
sudo hostnamectl set-hostname aws-dbserver-1a.localdomain
sed -i 's/localhost/aws-dbserver-1a/g' /etc/hosts
sed -i 's/localhost.localdomain/aws-dbserver-1a/g' /etc/hosts
# タイムゾーン
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
```
このスクリプトでは、まずホスト名を変更し、次に、sedコマンドを使用して、/etc/hostsファイル内のlocalhostとlocalhost.localdomainを新しいホスト名に置換します。その後、タイムゾーンを変更し、言語設定を変更します。

#### sedコマンドの使い方　`file.txt`というファイルの中で、すべての`old`という文字列を`new`という文字列に置換する例です。


#### コマンドの実行

```bash
sed 's/old/new/g' file.txt
```

| 記号 | 説明 |
|------|------|
| **s** | 置換コマンドを指定します。 |
| **old** | 置換対象の文字列を指定します。 |
| **new** | 置換後の文字列を指定します。 |
| **g** | グローバル置換を指定します。行内のすべての一致する文字列を置換します。 |
| **file.txt** | 置換を行う対象のファイルを指定します。 |


#### 元のファイル (`file.txt`)

```
This is an old file.
The old file contains old data.
```

#### 実行結果

```
This is a new file.
The new file contains new data.
```

### EC2にApacheをインストールする手順
1. EC2インスタンスにログインします。
2. インスタンスが実行されているOSに合わせて、Apacheをインストールするためのパッケージを選択します。
   - Ubuntuの場合:
     ```bash
     sudo apt-get update
     sudo apt-get install apache2
     ```
   - Amazon Linux 2の場合:
     ```bash
     sudo yum update -y
     sudo yum install httpd -y
     ```
3. Apacheを起動します。
   ```bash
   sudo service apache2 start     # Ubuntu
   sudo service httpd start       # Amazon Linux 2
   ```
4. EC2インスタンスのセキュリティグループで、ポート80（HTTP）へのアクセスを許可します。これにより、外部からEC2インスタンスにアクセスできるようになります。

プロトコル: TCP
ポート範囲: 80
ソース: 0.0.0.0/0（すべてのIPアドレスからのアクセスを許可）


webブラウザで表示されるのは下記フォルダ
~~~
/var/www/html
~~~

所有者変更
~~~
sudo chown -R ec2-user /var/www/html
~~~

index.htmlなどを作成し、保存して、ブラウザ上でpublicIPアドレスを入力し、内容が表示されればOKです。
~~~
http://IPアドレス
~~~

これらの手順を実行することで、EC2インスタンスにApacheをインストールし、Webサーバーを起動することができます。

### Linuxコマンド OS、ネットワーク
__ifconfig__
ネットワークインターフェイスの情報を表示するコマンドです。
IPアドレス、サブネットマスク、MACアドレスなどを表示することができます。
-sオプションをつけると、シンプルな表示に切り替えることができます。
~~~
$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 12:34:56:78:90:ab  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          ...
$ ifconfig -s eth0
eth0  192.168.0.100  255.255.255.0  ...
~~~

__hostname__
ホスト名を表示するコマンドです。
~~~
$ hostname
myhostname
~~~

__date__
現在の日時を表示、または設定するコマンドです。
~~~
$ date
Sun Apr 11 11:22:33 JST 2023
$ sudo date --set "2023-04-11 12:34:56"
~~~

__netstat__
ネットワーク接続の状況を表示するコマンドです。
オプションによってTCP、UDP接続の情報、ルーティングテーブル、ソケットの状況などを表示することができます。
-rオプションをつけるとルーティングテーブルを表示することができます。
~~~
$ netstat -a
$ netstat -r
~~~

__ping__
指定したIPアドレスやホスト名に対して、疎通確認を行うコマンドです。
~~~
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.256 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.234 ms
...
~~~

__ssh__
セキュアなリモートシェル接続を行うためのコマンドです。
SSHプロトコルを使用して、別のコンピュータにログインすることができます。
接続先のホスト名やIPアドレス、ポート番号を指定することができます。
~~~
$ ssh username@hostname
$ ssh -p 2222 username@192.168.0.100
~~~

__df ディスク使用量・空き容量__
df コマンドは、ディスク使用量と空き容量を表示するために使用されます。
~~~
$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1       20480000  2023360  17421120  11% /
/dev/sda2      241856000 40184868 188854132  18% /home
/dev/sda3       20480000  1535956  17841624   8% /var
~~~
マウントポイントごとに使用可能な総容量、使用済み容量、空き容量、使用率などが表示されます。

__free メモリ空き状況を確認__
free コマンドは、現在のメモリの使用状況と空き容量を表示するために使用されます。
~~~
$ free
             total       used       free     shared    buffers     cached
Mem:       4047156    1910524    2136632     218240      80392     890064
-/+ buffers/cache:     936068    3111088
Swap:      4194300      35004    4159296
~~~
メモリの合計容量、使用済み容量、空き容量、共有メモリ、バッファ、キャッシュ、スワップの情報が表示されます。

__top CPU、メモリの使用状況を確認__
~~~
top - 12:10:58 up  1:09,  1 user,  load average: 0.26, 0.24, 0.21
Tasks: 197 total,   1 running, 196 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.3 sy,  0.0 ni, 98.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15860.0 total,   2314.4 free,   7868.4 used,   5687.1 buff/cache
MiB Swap:  16384.0 total,  16379.4 free,      4.6 used.   6115.9 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1529 root      20   0 2802604 390892  40524 S  5.0  2.4   1:23.89 gnome-shell
 1052 root     -51   0       0      0      0 S  0.7  0.0   0:56.50 irq/129-acpi_i
 1784 ken       20   0  678676 107744  75704 S  0.7  0.7   0:20.34 gnome-terminal-
 1206 root      20   0  381376  75720  38456 S  0.3  0.5   0:02.72 Xorg
 1925 ken       20   0 3021400 551588 120716 S  0.3  3.4   0:21.02 firefox
 1    root      20   0  168732  10380   7484 S  0.0  0.1   0:03.76 systemd
~~~
現在の時刻、システムの稼働時間、タスク数、CPU使用率、メモリ使用量などが表示されます。
その下には、各プロセスのPID、ユーザー名、CPU使用率、メモリ使用量、実行時間などが表示されます。

__「ps」コマンドの基本的な使用方法__
「ps」コマンドは、現在実行中のプロセスの情報を表示するために使用されます。
プロセスID (PID) を表示することもでき、PID を使用してプロセスを停止することができます。
~~~
$ ps
~~~
このコマンドは、現在実行中のすべてのプロセスを表示します。
しかし、表示される情報は少なく、実用的ではありません。より詳細な情報を表示するには、オプションを使用します。

よく使うオプションとして、「-a」オプションと「-u」オプションがあります。それぞれ、「a」オプションは、端末操作のプロセス (自分+他ユーザー) を表示し、「u」オプションは、各プロセスの実行ユーザー、CPU、メモリ使用量を表示します。
~~~
$ ps -a
$ ps -u
~~~
さらに、よく使うコマンドとして、「ps aux | grep xxx」があります。
「aux」オプションは、すべてのプロセスを表示するために使用され、「grep」コマンドは、キーワードに一致するプロセスを検索します。
これにより、プロセスの一覧から必要なプロセスを検索することができます。
~~~
$ ps aux | grep httpd
~~~
また、一部のプロセスは裏側で動作しているため、ユーザーが意図しない場合でも常に実行されています。
このようなプロセスを「デーモン」と呼びます。これらのプロセスは、「x」オプションを使用して表示することができます。
~~~
$ ps ax
~~~

最後に、「kill」コマンドを使用してプロセスを停止することができます。
プロセスを停止するには、そのプロセスのPIDを指定して「kill」コマンドを使用します。
~~~
$ kill PID
~~~
たとえば、プロセス番号が「1234」であるプロセスを停止する場合は、次のように入力します。
~~~
$ kill 1234
~~~


### Linuxコマンド ファイル操作

| コマンド | 説明 |
|----------|------|
| **ls**   | ディレクトリ内のファイルやフォルダーの一覧を表示します。 |
| **cd**   | カレントディレクトリを変更します。 |
| **mkdir**| 新しいディレクトリを作成します。 |
| **rm**   | ファイルやディレクトリを削除します。 |
| **cp**   | ファイルやディレクトリをコピーします。 |
| **mv**   | ファイルやディレクトリを移動します。 |
| **touch**| 新しいファイルを作成します。 |
| **cat**  | ファイルの中身を表示します。 |
| **chown**| ファイルのオーナーを変更します。 |
| **chmod**| ファイルのパーミッションを変更します。 |

Linuxにおけるファイルやディレクトリには、ユーザー、グループ、その他のユーザーのためのアクセス権が設定されています。
これらのアクセス権を変更するためには、chmodというコマンドを使用します。

chmodコマンドを使用すると、ファイルまたはディレクトリのアクセス権を変更できます。
アクセス権は、読み取り、書き込み、実行の3つの属性で構成されます。
これらの属性は、所有者、グループ、その他のユーザーのために個別に設定できます。

属性は、r（読み取り）、w（書き込み）、x（実行）の3つの文字で表されます。
これらの文字は、ファイルまたはディレクトリを所有するユーザー、グループ、その他のユーザーのためにそれぞれ設定されます。

また、rは4、wは2、xは1の数値で表すこともできます。これは、数字で表されるアクセス権の表記法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/3013177c-0155-2624-9fd5-357ec168566d.png)
たとえば、rwxr-xr--の場合、所有者に読み取り、書き込み、実行のアクセス権があり、
グループには読み取り、実行のアクセス権があり、その他のユーザーには読み取りのアクセス権があることを意味します。
この場合、所有者は7、グループは5、その他のユーザーは4で表されます。

ファイルまたはディレクトリに対するアクセス権を設定する場合、次のように指定します。

数字で表したアクセス権を使用する場合
~~~
chmod 755 filename
~~~
記号で表したアクセス権を使用する場合
~~~
chmod u+rwx,g+rx,o+r filename
~~~
所有者には読み取り、書き込み、実行のアクセス権があり、グループとその他のユーザーには読み取りと実行のアクセス権があります。


### Linuxコマンド 定番

| コマンド | 説明 |
|----------|------|
| **pwd**  | 現在のディレクトリのパスを表示します。 |
| **rmdir** | 空のディレクトリを削除します。 |
| **grep** | ファイルの中から特定のパターンを検索します。 |
| **sed**  | ファイルの中の文字列を置換します。 |
| **ps**   | 現在実行中のプロセスを表示します。 |
| **top**  | システムのリソース使用状況を監視します。 |
| **tar**  | ファイルをアーカイブし、圧縮または解凍します。 |




### viエディタ

| コマンド | 説明 |
|----------|------|
| **ESC**  | 編集モードからコマンドモードに切り替える |
| **x**    | カーソルがある文字を削除する |
| **/**    | 検索する文字列を入力する |
| **:wq!** | 保存して終了する（!をつけることで、強制的に終了する） |

### ファイル表示

__cat__
ファイルの中身を表示

例えば、cat file.txtと入力すると、file.txtの中身がターミナル上に表示されます。

~~~
cat file.txt
~~~

__tail__
ファイルの末尾から指定した行数を表示

例えば、tail -n 10 file.txtと入力すると、file.txtの末尾から10行を表示します。

~~~
tail -n 10 file.txt
~~~

__lessまたはmore__
ターミナルに出力せずに何かを見たい場合に使用する

例えば、less file.txtまたはmore file.txtと入力すると、file.txtの中身を1行進むにはEnterを、1画面進むにはSpaceを、抜けるにはqを押します。

~~~
less file.txt
~~~
~~~
more file.txt
~~~

__ファイル上書き__
　>を使用してファイルを上書き

例えば、echo "Hello World" > file.txtと入力すると、file.txtに"Hello World"が上書きされます。

~~~
echo "Hello World" > file.txt
~~~

__ファイル追記__
　>>を使用してファイルに追記

例えば、echo "Hello World" >> file.txtと入力すると、file.txtの末尾に"Hello World"が追記されます。

~~~
echo "Hello World" >> file.txt
~~~

__find__
指定した条件に一致するファイルを検索する

例えば、find /home/user -name "*.txt"と入力すると、/home/userディレクトリ以下の拡張子が.txtのファイルを検索します。
~~~
find /home/user -name "*.txt"
~~~


__grep__
指定した文字列が含まれた行を検索

例えば、grep "Hello" file.txtと入力すると、file.txtの中で"Hello"が含まれた行を表示します。

__"Hello"が含まれた行を検索する__
~~~
grep "Hello" file.txt
~~~
~~~
This is a line containing the word Hello.
Hello, world!
~~~

__複数のファイルを検索する__
~~~
grep "Hello" file1.txt file2.txt file3.txt
~~~
~~~
file1.txt: This is a line containing the word Hello.
file2.txt: Hello, world!
file3.txt: Hello again!
~~~

__正規表現を使用して数字のみを含む行を検索する__
~~~
grep "^[0-9]*$" file.txt
~~~
~~~
12345
67890
~~~

__行番号表示__
-nオプションを付けることで、各行の行番号を表示

例えば、grep -n "Hello" file.txtと入力すると、file.txtの中で"Hello"が含まれた行とその行番号を表示します。

~~~
grep -n "Hello" file.txt
~~~
これにより、"Hello"という文字列を含むすべての行が表示され、各行の行番号が表示されます。行番号は、コロンの前に表示されます。

~~~
1:Hello, how are you?
3:Hello, nice to meet you.
5:Hello, world!
~~~
この場合、"Hello"が含まれる行は1行目、3行目、5行目であり、それぞれの行番号が1、3、5であることがわかります。

### Linuxの一般的なディレクトリ構造

| ディレクトリ | 説明 |
|--------------|------|
| **/** | ルートディレクトリ。すべてのディレクトリやファイルの最上位に位置し、システム全体を管理するためのディレクトリ。 |
| **/bin** | 基本的なシステムツールやコマンドを格納するためのディレクトリ。 |
| **/boot** | システム起動に必要なファイルを格納するためのディレクトリ。 |
| **/dev** | デバイスファイルを格納するためのディレクトリ。デバイスファイルとは、コンピュータの周辺機器や装置などを表すファイルです。 |
| **/etc** | システム全体の設定ファイルを格納するためのディレクトリ。 |
| **/home** | ユーザのホームディレクトリを格納するためのディレクトリ。 |
| **/lib** | システムに必要なライブラリファイルを格納するためのディレクトリ。 |
| **/media** | リムーバブルデバイス（USBメモリやCD-ROMなど）をマウントするためのディレクトリ。 |
| **/mnt** | ファイルシステムを一時的にマウントするためのディレクトリ。 |
| **/opt** | サードパーティのアプリケーションを格納するためのディレクトリ。 |
| **/proc** | カーネルやプロセスに関する情報を提供するための仮想ファイルシステム。 |
| **/root** | rootユーザのホームディレクトリを格納するためのディレクトリ。 |
| **/run** | システム起動時に生成されるランタイムデータを格納するためのディレクトリ。 |
| **/sbin** | システム管理用のコマンドやツールを格納するためのディレクトリ。 |
| **/srv** | システム上で提供するサービスのデータを格納するためのディレクトリ。 |
| **/sys** | カーネルが提供するデバイスやシステム情報を提供するための仮想ファイルシステム。 |
| **/tmp** | 一時的なファイルを格納するためのディレクトリ。 |
| **/usr** | システム全体の共有データやアプリケーションを格納するためのディレクトリ。 |
| **/var** | システムのログや一時ファイル、メールなど、可変データを格納するためのディレクトリ。 |


### Laravel
Laravelは、PHP開発者にとって非常に人気のあるフレームワークの1つとなっています。また、Laravelは、コミュニティが大きく、多数のオープンソースのパッケージやツールを提供しているため、PHPの機能を利用し、開発者が迅速かつ効率的にアプリケーションを構築できるようにする多くの機能を提供しています。

#### Laravelの特徴

| 特徴 | 説明 |
|------|------|
| **MVCアーキテクチャ** | Laravelは、MVC（Model-View-Controller）アーキテクチャに基づいて設計されており、アプリケーションの機能を論理的に分離し、開発の効率性を高めます。 |
| **Artisan CLI** | Laravelは、コマンドラインツール「Artisan」を提供しています。Artisanを使用すると、簡単にアプリケーションのタスクを実行できます。 |
| **Eloquent ORM** | Laravelは、Eloquentと呼ばれるORM（Object-Relational Mapping）を提供しています。Eloquentは、データベースのテーブルをオブジェクトとして扱えるようにします。 |
| **Bladeテンプレートエンジン** | Laravelは、Bladeと呼ばれるテンプレートエンジンを提供しています。Bladeを使用すると、テンプレート内でPHPコードを簡単に埋め込むことができます。 |
| **テストフレームワーク** | Laravelは、PHPUnitを使用したテストをサポートしています。Laravelのテストフレームワークを使用すると、アプリケーションの動作を簡単にテストできます。 |


### Laravelを使うための事前準備
**EC2・VPC・RDS設定**: LaravelアプリケーションをホストするためのEC2インスタンスを設定し、データベースをホストするためのRDSインスタンスを作成します。
**composer**: Laravelは、PHPのパッケージ管理システムであるComposerを使用して依存関係を解決します。
  ```bash
  $ curl -sS https://getcomposer.org/installer | php
  $ sudo mv composer.phar /usr/local/bin/composer
  ```
**Node.js**: Laravelは、JavaScriptを使用してフロントエンドの機能を実装します。
  ```bash
  $ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
  $ sudo yum install -y nodejs
  ```
**PHP各種モジュール**: Laravelは、多くのPHP拡張機能を使用します。
  ```bash
  $ sudo yum install -y php-bcmath php-ctype php-fileinfo php-json php-mbstring php-openssl php-pdo php-tokenizer php-xml php-zip
  ```
**Apache設定**: Laravelは、Apache Webサーバーを使用して実行されます。
  ```bash
  sudo vi /etc/httpd/conf/httpd.conf
  ```
  ```apache
  <Directory /var/www/html>
  AllowOverride All
  </Directory>
  ```
  ```bash
  sudo systemctl restart httpd
  ```

### LaravelアプリケーションをEC2インスタンスにデプロイする
**権限付与**:
  ```bash
  chmod -R 777 storage
  chmod -R 777 bootstrap/cache
  ```
**Composerを使用したライブラリのインストール**:
  ```bash
  composer update
  ```
**Node.jsを使用したフロントエンドのビルド**:
  ```bash
  npm i && npm run prod
  ```
**.envファイルの作成**:
  ```bash
  cp .env.example .env
  ```
**アプリケーションキーの生成**:
  ```bash
  php artisan key:generate
  ```

### Laravelの.envファイルの設定例
```env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
```
```bash
php artisan config:clear
php artisan migrate:fresh --seed
```
```apache
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
```

### LaravelのストレージにS3を使用する場合
**AWS SDK for PHPとleague/flysystem-aws-s3-v3のインストール**
  ```bash
  composer require league/flysystem-aws-s3-v3
  ```
**.envファイルの設定**
  ```env
  AWS_ACCESS_KEY_ID= // IAMロール設定なら空白でok
  AWS_SECRET_ACCESS_KEY= // IAMロール設定なら空白でok
  AWS_DEFAULT_REGION=ap-northeast-1 // 東京リージョン
  AWS_BUCKET=[バケット名]
  ```
**ファイルをアップロードするコード**
  ```php
  $file = $request->file('file');
  Storage::disk('s3')->putFile('/', $file);
  ```

  ここで、`putFile`メソッドの第一引数は、ファイルが保存されるS3上のパスを指定します。上記の例では、ルートディレクトリにファイルが保存されます。第二引数には、アップロードされるファイルを指定します。この例では、リクエストからファイルを取得していますが、アップロードされたファイルのパスを直接指定することもできます。


アプリケーション開発に集中するための方法を模索した
本記事はQmonus Value Streamの投稿キャンペーン記事です。