AWS Cloud9용 LAMP 자습서 - AWS Cloud9

AWS Cloud9 신규 고객은 더 이상 사용할 수 없습니다. 의 기존 고객은 정상적으로 서비스를 계속 이용할 AWS Cloud9 수 있습니다. 자세히 알아보기”

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Cloud9용 LAMP 자습서

이 자습서를 통해 AWS Cloud9 개발 환경 내에서 LAMP(Linux, Apache HTTP 서버, MySQL 및 PHP)를 설정하고 실행할 수 있습니다.

이 자습서를 따르고 이 샘플을 생성하면 AWS 계정에 요금이 발생할 수 있습니다. 여기에는 Amazon Elastic Compute Cloud(Amazon EC2)와 같은 AWS services에 대해 발생할 수 있는 요금이 포함됩니다. 자세한 내용은 Amazon EC2 요금을 참조하세요.

필수 조건

이 샘플을 사용하기 전에 설정이 다음 요구 사항을 충족하는지 확인하세요.

  • 기존 AWS Cloud9 EC2 개발 환경이 있어야 합니다. 이 샘플에서는 Amazon Linux 또는 Ubuntu 서버를 실행 중인 Amazon EC2 인스턴스에 연결된 EC2 환경이 이미 있다고 가정합니다. 다른 환경 또는 운영 시스템이라면 이 샘플 지침을 관련 도구를 설치하는 데에 적용해야 합니다. 자세한 내용은 에서 환경 만들기 AWS Cloud9 섹션을 참조하세요.

  • 기존 환경에 대한 AWS Cloud9 IDE가 이미 열려 있습니다. 환경을 열 때 AWS Cloud9은 웹 브라우저에서 환경을 위한 IDE를 엽니다. 자세한 내용은 AWS Cloud9에서 환경 열기 섹션을 참조하세요.

1단계: 도구 설치

이 단계에서는 다음 도구를 설치합니다.

  • Apache HTTP 서버 - 웹 서버 호스트.

  • PHP - 특히 웹 개발에 적합하고 HTML에 포함할 수 있는 스크립팅 언어.

  • MySQL - 데이터베이스 관리 시스템.

그런 다음 Apache HTTP Server와 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의 경우(이 명령을 두 번 실행해야 할 수 있음):

    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. AWS Cloud9 IDE의 터미널 세션에서 다음 명령을 실행하여 MySQL 설치에 대한 MySQL 보안 모범 사례를 구현합니다.

    sudo mysql_secure_installation
  2. 메시지가 표시되면 지정된 대로 다음 질문에 답합니다.

    Amazon Linux의 경우:

    1. 루트의 현재 암호 입력(입력하지 않으려면 Enter) - Enter 키를 누릅니다(암호가 없는 경우).

    2. 루트 암호 설정 - Y를 입력한 후 Enter 키를 누릅니다.

    3. 새 암호 - 암호를 입력한 후 Enter 키를 누릅니다.

    4. 새 암호 다시 입력 - 암호를 다시 입력한 후 Enter 키를 누릅니다. (나중에 사용할 수 있도록 암호를 안전한 위치에 저장해야 합니다.)

    5. 익명 사용자 제거 - Y를 입력한 후 Enter 키를 누릅니다.

    6. 원격으로 루트 로그인 허용 안 함 - Y를 입력한 후 Enter 키를 누릅니다.

    7. 테스트 데이터베이스를 제거하고 액세스 - Y를 입력한 후 Enter 키를 누릅니다.

    8. 지금 권한 테이블 다시 로드 - Y를 입력한 후 Enter 키를 누릅니다.

    Ubuntu 서버용:

    1. VALIDATE PASSWORD 플러그인을 설정하시겠습니까 - y를 입력한 후 Enter 키를 누릅니다.

    2. 세 가지 수준의 암호 확인 정책이 있습니다 - 0, 1 또는 2를 입력한 후 Enter 키를 누릅니다.

    3. 새 암호 - 암호를 입력한 후 Enter 키를 누릅니다.

    4. 새 암호 다시 입력 - 암호를 다시 입력한 후 Enter 키를 누릅니다. 나중에 사용할 수 있도록 암호를 안전한 위치에 저장해야 합니다.

    5. 제공된 암호를 계속 사용하시겠습니까 - y를 입력한 후 Enter 키를 누릅니다.

    6. 익명 사용자 제거 - y를 입력한 후 Enter 키를 누릅니다.

    7. 원격으로 루트 로그인 허용 안 함 - y를 입력한 후 Enter 키를 누릅니다.

    8. 테스트 데이터베이스를 제거하고 액세스 - y를 입력한 후 Enter 키를 누릅니다.

    9. 지금 권한 테이블 다시 로드 - y를 입력한 후 Enter 키를 누릅니다.

  3. MySQL과 직접 상호 작용하려면 다음 명령을 실행하여 MySQL 명령줄 클라이언트를 루트 사용자로 시작합니다. 메시지가 표시되면 앞서 설정한 루트 사용자의 암호를 입력한 후 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의 터미널 세션에서 다음과 같은 여섯 가지 명령을 다음 순서로 한 번에 하나씩 실행합니다. 각 명령이 수행하는 작업을 이해하려면 각 명령 뒤의 # 문자 뒤의 정보를 읽습니다.

    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. 다음 명령을 실행하여 Apache HTTP Server의 기본 웹 사이트 루트 폴더(/var/www/html)에 index.php라는 PHP 기반 웹 페이지를 만듭니다.

    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 서버용 명령은 파일의 소유자를 ubuntu로 변경하고, 파일의 그룹을 web-content로 변경하며, 파일의 권한을 사용자의 경우 읽기/쓰기, 그룹 및 기타의 경우 읽기/실행으로 변경합니다.

    성공하면 앞의 명령이 다음 내용이 포함된 index.php 파일을 만듭니다.

    <?php phpinfo(); ?>
  3. Amazon VPC의 네트워크 ACL 및 이 EC2 환경과 연결된 Amazon EC2의 보안 그룹을 설정하여 새 웹 페이지를 보도록 포트 80을 통한 수신 웹 트래픽을 활성화합니다. 이를 수행하려면 다음과 같은 여덟 가지 명령을 다음 순서로 한 번에 하나씩 실행합니다. 각 명령이 수행하는 작업을 이해하려면 각 명령의 # 문자 뒤의 정보를 읽습니다.

    중요

    다음 명령을 실행하면 이 환경의 보안 그룹 및 네트워크 ACL과 연결된 모든 EC2 환경 및 Amazon EC2 인스턴스에 대해 포트 80을 통해 들어오는 웹 트래픽이 허용됩니다. 그러면 이것 외에도 EC2 환경 및 Amazon EC2 인스턴스에 대해 포트 80을 통한 수신 웹 트래픽이 예기치 않게 허용될 수 있습니다.

    참고

    다음 두 번째부터 네 번째 명령은 보안 그룹이 포트 80을 통한 수신 웹 트래픽을 허용할 수 있게 합니다. 포트 22를 통한 수신 SSH 트래픽만 허용하는 기본 보안 그룹이 있는 경우, 첫 번째 명령을 실행한 후 이러한 두 번째부터 네 번째 명령을 실행해야 합니다. 그러나 사용자 지정 보안 그룹이 이미 포트 80을 통한 수신 웹 트래픽을 허용하는 경우, 그러한 명령 실행을 건너뛸 수 있습니다.

    다음 다섯 번째부터 여덟 번째 명령은 네트워크 ACL이 포트 80을 통한 수신 웹 트래픽을 허용할 수 있게 합니다. 이미 모든 포트를 통한 모든 수신 트래픽을 허용하는 기본 네트워크 ACL이 있는 경우 그러한 명령 실행을 안전하게 건너뛸 수 있습니다. 하지만 포트 80을 통한 수신 웹 트래픽을 허용하지 않는 사용자 지정 네트워크 ACL이 있다고 가정해 보겠습니다. 그런 다음, 첫 번째 명령을 실행한 후 다섯 번째 명령부터 여덟 번째 명령까지 실행합니다.

    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을 통해 들어오는 웹 트래픽을 비활성화하려는 상황을 가정해 보겠습니다. 그렇다면 다음 여덟 가지 명령을 다음 순서로 한 번에 하나씩 실행하여 환경과 연결된 보안 그룹 및 네트워크 ACL에서 앞서 설정한 해당 수신 트래픽 규칙을 삭제합니다. 각 명령이 수행하는 작업을 이해하려면 각 명령의 # 문자 뒤의 정보를 읽습니다.

중요

다음 명령을 실행하면 이 환경의 보안 그룹 및 네트워크 ACL과 연결된 모든 EC2 환경 및 Amazon EC2 인스턴스에 대해 포트 80을 통해 들어오는 웹 트래픽이 허용되지 않습니다. 그러면 이것 외에도 EC2 환경 및 Amazon EC2 인스턴스에 대해 포트 80을 통한 수신 웹 트래픽이 예기치 않게 허용되지 않을 수 있습니다.

참고

다음 다섯 번째 명령부터 여덟 번째 명령은 네트워크 ACL이 포트 80을 통한 수신 웹 트래픽을 허용하지 못하도록 기존 규칙을 제거합니다. 이미 모든 포트를 통한 모든 수신 트래픽을 허용하는 기본 네트워크 ACL이 있는 경우 그러한 명령 실행을 건너뛸 수 있습니다. 하지만 포트 80을 통한 수신 웹 트래픽을 허용하는 기존 규칙이 포함된 사용자 지정 네트워크 ACL이 있고 해당 규칙을 삭제하려는 경우를 가정해 보겠습니다. 그런 다음, 첫 번째 명령을 실행한 후 다섯 번째 명령부터 여덟 번째 명령까지 실행해야 합니다.

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에서 환경 삭제 단원을 참조하세요.