AWS Cloud9 の LAMP チュートリアル - AWS Cloud9

新規のお客様への AWS Cloud9 の提供は終了しました。AWS Cloud9 の既存のお客様は、通常どおりサービスを引き続き使用できます。詳細はこちら

AWS Cloud9 の LAMP チュートリアル

このチュートリアルでは、AWS Cloud9 開発環境内で LAMP (Linux、Apache HTTP Server、MySQL、および PHP) をセットアップして実行できます。

このチュートリアルに従って、このサンプルを作成すると、AWS アカウント アカウントに料金が発生する可能性があります。これには、Amazon Elastic Compute Cloud (Amazon EC2) などの AWS のサービス に対して発生する可能性のある料金が含まれます。詳細については、「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 サーバーの場合:

    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 サーバーの場合:

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

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

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

    Amazon Linux の場合:

    sudo yum install -y php56

    Ubuntu サーバーの場合:

    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 サーバーの場合:

    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 を設定します。これらのセキュリティのベストプラクティスには、ルートアカウントのパスワードの設定や、ローカルホストの外部からアクセス可能なルートアカウントの削除が含まれます。他に注意すべきベストプラクティスとしては、匿名ユーザーの削除、テスト用データベースの削除、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 サーバーの場合:

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

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

    3. 新しいパスワード – パスワードを入力し、Enter を押します。

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

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

    6. 匿名ユーザーの削除y と入力し、Enter を押します。

    7. ルートのリモートログインを禁止y と入力し、Enter を押します。

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

    9. 権限テーブルを再ロードy と入力し、Enter を押します。

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

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

    exit;

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

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

次に、この EC2環境に関連付けられている Amazon Virtual Private Cloud (Amazon VPC) にあるAmazon EC2 のセキュリティグループと Amazon EC2 とネットワークのアクセスコントロールリスト (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 サーバーの場合:

    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 サーバーの場合:

    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 で環境を削除する を参照してください。