AWS Cloud9
ユーザーガイド

AWS Cloud9 の LAMP サンプル

このサンプルでは、AWS Cloud9 開発環境 内で LAMP (Linux、Apache HTTP Server、MySQL、PHP) をセットアップして実行することができます。

このサンプルを作成すると、AWS アカウントに課金される場合があります。このような請求には、Amazon Elastic Compute Cloud (Amazon EC2) などのサービスに対して発生する料金も含まれます。詳細については、「Amazon EC2 料金表」を参照してください。

前提条件

このサンプルを使用する前に、以下の前提条件を満たしていることを確認します。

  • 既存の AWS Cloud9 EC2 開発環境 がある。 このサンプルでは、Amazon Linux または Ubuntu Server を実行する Amazon EC2 インスタンスに接続された EC2 環境 が既にあることを前提としています。別のタイプまたはオペレーティングシステムの 環境 がある場合、このサンプルの手順を調整して関連ツールをセットアップする必要がある場合があります。詳細については、「AWS Cloud9 で 環境 を作成する」を参照してください。

  • 既存の環境に既に開いている AWS Cloud9 IDE がある。 環境 を開くと、AWS Cloud9 によってその 環境 の IDE がウェブブラウザで開かれます。詳細については、「AWS Cloud9 で環境を開く」を参照してください。

ステップ 1: ツールのインストール

このステップでは、以下のツールをインストールします。

  • Apache HTTP Server: ウェブサーバーホスト。

  • PHP: 特にウェブ開発に適しており、HTML に埋め込むことができるスクリプト言語。

  • MySQL: データベース管理システム。

その後、このステップを終了するには、Apache HTTP サーバーを起動後、MySQL を起動します。

  1. インスタンスに最新のセキュリティ更新プログラムとバグ修正が適用されていることを確認します。そのためには、AWS Cloud9 IDE のターミナルセッションで、yum update コマンド (Amazon Linux の場合)、または apt update コマンド (Ubuntu Server の場合) を実行します。(新しいターミナルセッションを開始するには、メニューバーで、[Window (ウィンドウ)]、[New Terminal (新しいターミナル)] の順に選択します。)

    複数 Amazon Linux:

    sudo yum -y update

    Ubuntu Server の場合:

    sudo apt -y update
  2. Apache HTTP Server が既にインストールされているかどうかを確認します。確認するには、httpd -v コマンド (Amazon Linux の場合) または apache2 -v (Ubuntu Server の場合) コマンドを実行します。

    成功すると、Apache HTTP Server のバージョン番号が出力に表示されます。

    エラーが発生する場合は、install コマンドを実行して Apache HTTP Server をインストールします。

    複数 Amazon Linux:

    sudo yum install -y httpd24

    Ubuntu Server の場合:

    sudo apt install -y apache2
  3. php -v コマンドを実行して PHP が既にインストールされているかどうかを確認します。

    成功すると、出力に PHP のバージョン番号が表示されます。

    エラーが発生する場合は、install コマンドを実行して PHP をインストールします。

    複数 Amazon Linux:

    sudo yum install -y php56

    Ubuntu Server の場合:

    sudo apt install -y php libapache2-mod-php php-xml
  4. mysql --version コマンドを実行して MySQL が既にインストールされているかどうかを確認します。

    成功すると、出力に MySQL のバージョン番号が表示されます。

    エラーが発生する場合は、install コマンドを実行して MySQL をインストールします。

    複数 Amazon Linux:

    sudo yum install -y mysql-server

    Ubuntu Server の場合:

    sudo apt install -y mysql-server
  5. Apache HTTP Server、PHP、および MySQL をインストールしたら、Apache HTTP Server を起動後、次のコマンドを実行して、起動したことを確認します。

    Amazon Linux の場合 (このコマンドを 2 回実行する必要がある場合があります):

    sudo service httpd start && sudo service httpd status

    Ubuntu Server の場合 (コマンドプロンプトに戻るには、q を押します):

    sudo service apache2 start && sudo service apache2 status
  6. MySQL を起動後、次のコマンドを実行して、起動したことを確認します。

    複数 Amazon Linux:

    sudo service mysqld start && sudo service mysqld status

    Ubuntu Server の場合 (コマンドプロンプトに戻るには、q を押します):

    sudo service mysql start && sudo service mysql status

ステップ 2: MySQL をセットアップする

このステップでは、MySQL セキュリティのベストプラクティスに従うように MySQL を設定します。これらのセキュリティ上のベストプラクティスには、root アカウントのパスワードの設定、ローカルホストの外部からアクセス可能な root アカウントの削除、匿名ユーザーアカウントの削除、テストデータベースの削除、test_ で始まる名前を含むデータベースへのアクセスを許可する特権の削除などがあります。

その後、MySQL コマンドラインクライアントの起動と終了を行い、このステップを終了します。

  1. MySQL をインストールするための MySQL セキュリティのベストプラクティスを実装するには、AWS Cloud9 IDE のターミナルセッションで次のコマンドを実行します。

    sudo mysql_secure_installation
  2. プロンプトが表示されたら、指定されたとおりに次の質問に回答します。

    複数 Amazon Linux:

    1. root の現在のパスワードを入力 (ない場合は Enter キー)Enter を押してください (パスワードがない場合)。

    2. root のパスワードの設定Y と入力し、Enter を押してください。

    3. 新しいパスワード – パスワードを入力し、Enter を押してください。

    4. 新しいパスワードの再入力 – パスワードを再入力し、Enter を押してください。(後に使用できるように、パスワードは安全な場所に保存してください。)

    5. 匿名ユーザーの削除Y と入力し、Enter を押してください。

    6. root のリモートログインを禁止Y と入力し、Enter を押してください。

    7. テストデータベースを削除し、アクセスするY と入力し、Enter を押してください。

    8. 権限テーブルを再ロードY と入力し、Enter を押してください。

    Ubuntu Server の場合:

    1. パスワード検証プラグインのセットアップy と入力し、Enter を押してください。

    2. パスワード検証ポリシーには 3 つのレベルがあります01、または 2 と入力し、Enter を押してください。

    3. 新しいパスワード – パスワードを入力し、Enter を押してください。

    4. 新しいパスワードの再入力 – パスワードを再入力し、Enter を押してください。(後に使用できるように、パスワードは安全な場所に保存してください。)

    5. 提供されたパスワードを続行しますか?y と入力し、Enter を押してください。

    6. 匿名ユーザーの削除y と入力し、Enter を押してください。

    7. root のリモートログインを禁止y と入力し、Enter を押してください。

    8. テストデータベースを削除し、アクセスするy と入力し、Enter を押してください。

    9. 権限テーブルを再ロードy と入力し、Enter を押してください。

  3. MySQL を直接操作するには、次のコマンドを実行して、root ユーザーとして MySQL コマンドラインクライアントを起動します。プロンプトが表示されたら、先ほど設定した root ユーザーのパスワードを入力し、Enter を押します。(MySQL コマンドラインクライアントを使用している場合、プロンプトは mysql> に変更されます。)

    sudo mysql -uroot -p
  4. MySQL コマンドラインクライアントを終了するには、次のコマンドを実行します。(プロンプトは $ に戻ります。)

    exit;

ステップ 3: ウェブサイトの設定

このステップでは、Apache HTTP Server のデフォルトウェブサイトのルートに、推奨される所有者とアクセス許可を設定します。その後、そのデフォルトウェブサイトのルート内に PHP ベースのウェブページを作成します。

次に、この EC2 環境 に 関連付けられている Amazon EC2 のセキュリティグループと Amazon Virtual Private Cloud (Amazon VPC) のネットワークアクセスコントロールリスト (ネットワーク ACL) を設定して、着信ウェブトラフィックでそのウェブページを表示できるようにします。各 EC2 環境 は、Amazon EC2 のセキュリティグループと Amazon VPC のネットワーク ACL の両方に関連付ける必要があります。ただし、AWS アカウントのデフォルトネットワーク ACL では 環境 のすべての送受信トラフィックが許可されていますが、デフォルトセキュリティグループでは、ポート 22 経由で SSH を使用した着信トラフィックのみが許可されています。詳細については、「AWS Cloud9 開発環境 の VPC の設定」を参照してください。

その後、AWS Cloud9 IDE の外部からウェブページを正常に表示して、このステップを終了します。

  1. Apache HTTP Server のデフォルトウェブサイトのルート (/var/www/html) に、推奨される所有者とアクセス許可を設定します。設定するには、AWS Cloud9 IDE のターミナルセッションで、次の 6 個のコマンドを次の順序で 1 度に 1 つずつ実行します。各コマンドの動作を理解するには、各コマンドの後の # の情報をお読みください。

    複数 Amazon Linux:

    sudo groupadd web-content # Create a group named web-content. sudo usermod -G web-content -a ec2-user # Add the user ec2-user (your default user for this environment) to the group web-content. sudo usermod -G web-content -a apache # Add the user apache (Apache HTTP Server) to the group web-content. sudo chown -R ec2-user:web-content /var/www/html # Change the owner of /var/www/html and its files to user ec2-user and group web-content. sudo find /var/www/html -type f -exec chmod u=rw,g=rx,o=rx {} \; # Change all file permissions within /var/www/html to user read/write, group read-only, and others read/execute. sudo find /var/www/html -type d -exec chmod u=rwx,g=rx,o=rx {} \; # Change /var/www/html directory permissions to user read/write/execute, group read/execute, and others read/execute.

    Ubuntu Server の場合:

    sudo groupadd web-content # Create a group named web-content. sudo usermod -G web-content -a ubuntu # Add the user ubuntu (your default user for this environment) to the group web-content. sudo usermod -G web-content -a www-data # Add the user www-data (Apache HTTP Server) to the group web-content. sudo chown -R ubuntu:web-content /var/www/html # Change the owner of /var/www/html and its files to user ubuntu and group web-content. sudo find /var/www/html -type f -exec chmod u=rw,g=rx,o=rx {} \; # Change all file permissions within /var/www/html to user read/write, group read-only, and others read/execute. sudo find /var/www/html -type d -exec chmod u=rwx,g=rx,o=rx {} \; # Change /var/www/html directory permissions to user read/write/execute, group read/execute, and others read/execute.
  2. 次のコマンドを実行して、index.php という PHP ベースのウェブページを Apache HTTP Server のデフォルトウェブサイトルートフォルダ (/var/www/html) に作成します。

    複数 Amazon Linux:

    sudo touch /var/www/html/index.php && sudo chown -R ec2-user:web-content /var/www/html/index.php && sudo chmod u=rw,g=rx,o=rx /var/www/html/index.php && sudo printf '%s\n%s\n%s' '<?php' ' phpinfo();' '?>' >> /var/www/html/index.php

    Amazon Linux の場合も、上記コマンドによって、ファイルの所有者は ec2-user に、ファイルのグループは web-content に、ファイルのアクセス許可は、読み書き (ユーザー)、読み取り/実行 (グループ、その他) に変更されます。

    Ubuntu Server の場合:

    sudo touch /var/www/html/index.php && sudo chown -R ubuntu:web-content /var/www/html/index.php && sudo chmod u=rw,g=rx,o=rx /var/www/html/index.php && sudo printf '%s\n%s\n%s' '<?php' ' phpinfo();' '?>' >> /var/www/html/index.php

    Ubuntu Server の場合も、上記コマンドによって、ファイルの所有者は ubuntu に、ファイルのグループは web-content に、ファイルのアクセス許可は、読み書き (ユーザー)、読み取り/実行 (グループ、その他) に変更されます。

    上記コマンドが正常に実行されると、次の内容で index.php ファイルが作成されます。

    <?php phpinfo(); ?>
  3. Amazon VPC のネットワーク ACL と、この EC2 環境 に関連付けられている Amazon EC2 のセキュリティグループを設定して、ポート 80 経由の着信ウェブトラフィックで新しいウェブページを表示できるようにします。そのためには、次の 8 個のコマンドを一度に 1 つずつ次の順序で実行します。各コマンドの動作を理解するには、各コマンドの # の後に表示される情報をお読みください。

    重要

    次のコマンドを実行すると、この 環境 のセキュリティグループおよびネットワーク ACL に関連付けられているすべての EC2 環境 インスタンスおよび Amazon EC2 インスタンスに対して、ポート 80 経由の着信ウェブトラフィックが有効になります。これにより、これ以外の EC2 環境 および Amazon EC2 インスタンスに対して、ポート 80 経由の着信ウェブトラフィックが予期せずに有効になる可能性があります。

    注記

    次の 2 番目から 4 番目のコマンドでは、セキュリティグループのポート 80 経由の着信ウェブトラフィックが有効になります。ポート 22 経由の着信 SSH トラフィックのみを許可するデフォルトのセキュリティグループがある場合は、最初のコマンドとそれに続く 2 番目から 4 番目のコマンドを実行する必要があります。ただし、カスタムセキュリティグループで、既にポート 80 経由の着信ウェブトラフィックが許可されている場合は、これらのコマンドの実行をスキップすることができます。

    次の 5 番目から 8 番目のコマンドでは、ネットワーク ACL のポート 80 経由の着信ウェブトラフィックが有効になります。デフォルトのネットワーク ACL があり、すべてのポート経由ですべての着信トラフィックがすでに許可されている場合は、これらのコマンドの実行をスキップすることができます。ただし、ポート 80 経由の着信ウェブトラフィックを許可しないカスタムネットワーク ACL がある場合は、最初のコマンドとそれに続く 5 番目から 8 番目のコマンドを実行する必要があります。

    MY_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) # Get the ID of the instance for the environment, and store it temporarily. MY_SECURITY_GROUP_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SecurityGroups[0].GroupId' --output text) # Get the ID of the security group associated with the instance, and store it temporarily. aws ec2 authorize-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --protocol tcp --cidr 0.0.0.0/0 --port 80 # Add an inbound rule to the security group to allow all incoming IPv4-based traffic over port 80. aws ec2 authorize-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --ip-permissions IpProtocol=tcp,Ipv6Ranges='[{CidrIpv6=::/0}]',FromPort=80,ToPort=80 # Add an inbound rule to the security group to allow all incoming IPv6-based traffic over port 80. MY_SUBNET_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SubnetId' --output text) # Get the ID of the subnet associated with the instance, and store it temporarily. MY_NETWORK_ACL_ID=$(aws ec2 describe-network-acls --filters Name=association.subnet-id,Values=$MY_SUBNET_ID --query 'NetworkAcls[].Associations[0].NetworkAclId' --output text) # Get the ID of the network ACL associated with the subnet, and store it temporarily. aws ec2 create-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --protocol tcp --rule-action allow --rule-number 10000 --cidr-block 0.0.0.0/0 --port-range From=80,To=80 # Add an inbound rule to the network ACL to allow all IPv4-based traffic over port 80. Advanced users: change this suggested rule number as desired. aws ec2 create-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --protocol tcp --rule-action allow --rule-number 10100 --ipv6-cidr-block ::/0 --port-range From=80,To=80 # Add an inbound rule to the network ACL to allow all IPv6-based traffic over port 80. Advanced users: change this suggested rule number as desired.
  4. ウェブサーバーのルート内にある index.php ファイルへの URL を取得します。これを行うには、次のコマンドを実行し、新しいウェブブラウザタブ、または AWS Cloud9 IDE とは別のウェブブラウザを使用して、表示されている URL に移動します。正常に実行された場合は、Apache HTTP Server、MySQL、PHP、およびその他の関連設定に関する情報がウェブページに表示されます。

    MY_PUBLIC_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4) && echo http://$MY_PUBLIC_IP/index.php # Get the URL to the index.php file within the web server root.

ステップ 4: クリーンアップ

この 環境 を引き続き使用するが、ポート 80 経由の着信ウェブトラフィックを無効にする場合は、次の 8 個のコマンドを 1 度にひとつずつ次の順序で実行し、環境 に関連付けられているセキュリティグループおよびネットワーク ACL で先ほど設定した該当の着信トラフィックルールを削除します。各コマンドの動作を理解するには、各コマンドの # の後に表示される情報をお読みください。

重要

次のコマンドを実行すると、この 環境 のセキュリティグループおよびネットワーク ACL に関連付けられているすべての EC2 環境 インスタンスおよび Amazon EC2 インスタンスに対して、ポート 80 経由の着信ウェブトラフィックが無効になります。これにより、これ以外の EC2 環境 および Amazon EC2 インスタンスに対して、ポート 80 経由の着信ウェブトラフィックが予期せずに無効になる可能性があります。

注記

次の 5 番目から 8 番目のコマンドでは、既存のルールを削除して、ネットワーク ACL でポート 80 経由の着信ウェブトラフィックが許可されないようにします。デフォルトのネットワーク ACL があり、すべてのポート経由ですべての着信トラフィックがすでに許可されている場合は、これらのコマンドの実行をスキップすることができます。ただし、ポート 80 経由の着信ウェブトラフィックを許可する既存のルールを含むカスタムのネットワーク ACL があり、それらのルールを削除する場合は、最初のコマンドとそれに続く 5 番目から 8 番目のコマンドを実行する必要があります。

MY_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) # Get the ID of the instance for the environment, and store it temporarily. MY_SECURITY_GROUP_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SecurityGroups[0].GroupId' --output text) # Get the ID of the security group associated with the instance, and store it temporarily. aws ec2 revoke-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --protocol tcp --cidr 0.0.0.0/0 --port 80 # Delete the existing inbound rule from the security group to block all incoming IPv4-based traffic over port 80. aws ec2 revoke-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --ip-permissions IpProtocol=tcp,Ipv6Ranges='[{CidrIpv6=::/0}]',FromPort=80,ToPort=80 # Delete the existing inbound rule from the security group to block all incoming IPv6-based traffic over port 80. MY_SUBNET_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SubnetId' --output text) # Get the ID of the subnet associated with the instance, and store it temporarily. MY_NETWORK_ACL_ID=$(aws ec2 describe-network-acls --filters Name=association.subnet-id,Values=$MY_SUBNET_ID --query 'NetworkAcls[].Associations[0].NetworkAclId' --output text) # Get the ID of the network ACL associated with the subnet, and store it temporarily. aws ec2 delete-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --rule-number 10000 # Delete the existing inbound rule from the network ACL to block all IPv4-based traffic over port 80. Advanced users: if you originally created this rule with a different number, change this suggested rule number to match. aws ec2 delete-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --rule-number 10100 # Delete the existing inbound rule from the network ACL to block all IPv6-based traffic over port 80. Advanced users: if you originally created this rule with a different number, change this suggested rule number to match.

この 環境 を使用し終わったら、今後料金が請求されないように、AWS アカウントは削除する必要があります。手順については、「AWS Cloud9 で環境を削除する」を参照してください。