> For the complete documentation index, see [llms.txt](https://workshop.habeen.me/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://workshop.habeen.me/ec2-session-hands-on-lab.md).

# EC2 Session Hands-on Lab

EC2 Linux 실습

***

<figure><img src="/files/pnQMmmwytOFhANvtDmpW" alt=""><figcaption></figcaption></figure>

* 키페어 생성하기
* 웹 서버 인스턴스 생성하기
* Session Manager를 사용하여 EC2 인스턴스에 접근하기
* CloudWatch Agent 설치
* 부하테스트를 통한 모니터링

***

## 키페어 생성하기 &#x20;

실습에서는 SSH 키 쌍을 사용하여 EC2 인스턴스를 생성해야 합니다. 다음 단계에 따라 이 실습에서 사용할 고유한 SSH 키 쌍을 생성할 수 있습니다.

1. AWS 관리 콘솔에 로그인하고 [Amazon EC2 콘솔 ](https://console.aws.amazon.com/ec2)을 엽니다. AWS 관리 콘솔의 오른쪽 상단 모서리에서 원하는 AWS 리전에 있는지 확인합니다.
2. 왼쪽 메뉴 하단의 네트워크 및 보안 섹션에서 **키 페어**를 클릭합니다. SSH 키 쌍을 관리하는 페이지가 표시됩니다.

<figure><img src="/files/hagMFxh297D3XzYzHgmA" alt=""><figcaption></figcaption></figure>

3. 새 SSH 키 페어를 생성하려면 브라우저 창의 맨 위에 있는 **키 페어 생성** 버튼을 클릭합니다.

<figure><img src="/files/Til0DJQSJqk1VMc30um8" alt=""><figcaption></figcaption></figure>

4. 키 페어 이름: 텍스트 상자에 **\[Your Name]-ImmersionDay**를 입력하고 **키 페어 생성** 버튼을 클릭합니다.  (Windows 사용자의 경우 Putty와 같은 서드파트 툴 사용을 희망하는 경우  파일 형식에 대해 **ppk**를 선택)<br>

   <figure><img src="/files/EJ4hoOH1sPH8j8fpz6MZ" alt=""><figcaption></figcaption></figure>
5. 웹 브라우저에서 **\[Your Name]-ImmersionDay.pem** 파일을 로컬 드라이브에 다운로드합니다. 브라우저 지침에 따라 파일을 기본 다운로드 위치에 저장합니다.

{% hint style="info" %}
방금 생성한 키페어를 사용하여 나머지 실습에서 진행하는 EC2 인스턴스를 관리합니다.
{% endhint %}

***

## 웹 서버 인스턴스 생성하기

1. 맨 왼쪽 메뉴 상단에서 **EC2 대시보드**를 클릭합니다. 그리고 **인스턴스 시작**을 클릭합니다.

<figure><img src="/files/lGSZD1pYBdsEZdcu21sW" alt=""><figcaption></figcaption></figure>

2. **Name**에 **Web server for IMD** 값을 넣습니다. 그리고 아래의 Amazon Machine Image에서 화면과 같이 기본 값 설정을 확인합니다.<br>

   <figure><img src="/files/kfaxTpx2NVREonhcX93N" alt=""><figcaption></figcaption></figure>
3. 인스턴스 유형에서 **t2.micro**를 선택합니다.<br>

   <figure><img src="/files/uJpxrw9ij6dpSajCke71" alt=""><figcaption></figcaption></figure>
4. 앞선 실습에서 생성한 키페어를 선택합니다.<br>

   <figure><img src="/files/TmzaZPVCkzMay5zHnh3S" alt=""><figcaption></figcaption></figure>
5. EC2가 위치할 공간을 설정하는 네트워크 설정에서 편집 버튼을 클릭합니다.<br>

   <figure><img src="/files/JeneD5Tdj0HkAGNI1jxR" alt=""><figcaption></figcaption></figure>

**default VPC** 및 **subnet**을 확인합니다. **퍼블릭 IP 자동 할당**은 **활성화**로 설정합니다. 바로 아래에서 네트워크 방화벽 역할을 하는 **보안 그룹**를 생성합니다. 보안 그룹은 방화벽 정책으로 허용하고자 하는 프로토콜과 주소를 지정하게 됩니다. 현재 생성하는 보안 그룹의 경우, 생성될 EC2에 적용되는 규칙입니다. 보안 그룹 이름과 설명에 *Immersion Day - Web Server* 를 입력 후, 보안 그룹 규칙 추가를 선택합니다.<br>

<figure><img src="/files/vGzfnmAEv6ovRHtKmYFG" alt=""><figcaption></figcaption></figure>

유형에 HTTP를 지정하여 웹 서비스를 위한 TCP/80도 함께 허용합니다. 소스 주소에서 **내 IP**를 선택합니다.

<figure><img src="/files/1vwA0mZnrNiGknwye4be" alt=""><figcaption></figcaption></figure>

6. 나머지 모든 값들은 기본값을 사용하고, 화면 하단의 **고급 세부 정보** 탭을 클릭하여 확장하십시오. \
   **사용자 데이터** 입력란에 아래의 값을 입력 후, **인스턴스 시작**을 클릭하세요.

<figure><img src="/files/geJioMmbXU2uUWpLK0Ru" alt=""><figcaption></figcaption></figure>

**메타데이터** 버전 드랍 다운을 클릭하고 \*\*V2만 해당(토큰 필수)\*\*를 선택합니다. ![](https://static.us-east-1.prod.workshops.aws/public/69265fd6-b183-4e58-8e44-b58874f69957/static/images/advanced-module/compute/gid-ec2-113.png)

<figure><img src="/files/LxCPzz4WnoAorn2uCxfm" alt=""><figcaption></figcaption></figure>

다음 내용을 **사용자 데이터** 필드에 붙여넣고 **인스턴스 시작**을 클릭하세요.&#x20;

```
#!/bin/sh
​
#Install a LAMP stack
dnf install -y httpd wget php-fpm php-mysqli php-json php php-devel
dnf install -y mariadb105-server
dnf install -y httpd php-mbstring
​
#Start the web server
chkconfig httpd on
systemctl start httpd
​
#Install the web pages for our lab
if [ ! -f /var/www/html/immersion-day-app-php7.zip ]; then
   cd /var/www/html
   wget -O 'immersion-day-app-php7.zip' 'https://habeen-test-s3.s3.ap-northeast-2.amazonaws.com/immersion_day_php_saltware.zip'
   unzip immersion-day-app-php7.zip
fi
​
# Update existing packages
dnf update -y
```

### - 웹서버 살펴보기

인스턴스가 상태 검사를 통과하여 로드가 완료될 때까지 기다립니다. \
새 브라우저 탭을 열고 EC2 인스턴스의 **퍼블릭 DNS 이름**을 브라우저에 입력하여 웹 서버를 찾습니다. \
EC2 인스턴스의 퍼블릭 DNS 이름은 위에서 강조 표시된 **퍼블릭 IPv4 DNS** 이름 줄을 검토하여 콘솔에서 찾을 수 있습니다. \ <br>

<figure><img src="/files/rS3IsxTrSlZNCWBxgXXc" alt=""><figcaption></figcaption></figure>

다음과 같은 웹 페이지를 확인할 수 있습니다.

<figure><img src="/files/IDEyka02xqL0SyHPXw56" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
만약 크롭 웹 브라우저를 사용하고 계시다면 **퍼블릭 IPv4 DNS** 값을 붙여넣을 때 자동으로 https가 DNS 값 앞에 자동으로 추가되어 에러가 발생할 수 있습니다. 따라서 `http://<DNS 이름>` 형태로 입력하시기 바랍니다.
{% endhint %}

## Session Manager를 사용하여 리눅스 인스턴스에 접근하기

Session Manager는 대화형 원클릭 브라우저 기반 셸 또는 AWS CLI를 통해 Amazon EC2 인스턴스를 관리할 수 있는 AWS Systems Manager의 기능입니다. Session Manager를 사용하여 계정의 인스턴스에 세션을 시작할 수 있습니다. 세션이 시작된 후, 다른 연결 유형을 통해 bash 명령을 실행할 수 있습니다.

### - Systems Manager를 위한 IAM 인스턴스 프로파일 생성

1. AWS 콘솔창에 접속한 후 IAM 콘솔 을 엽니다. 네비게이션 항목에서 **역할**을 선택한 후, **역할 생성**을 클릭합니다.&#x20;

<figure><img src="/files/VsRn3F1nNR21Clr8LHM6" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/QBPA6tCRRz2D3L8kL2Cl" alt=""><figcaption></figcaption></figure>

2. **신뢰할 수 있는 엔터티 유형**에서 **AWS 서비스**를 선택합니다. 바로 아래에 이 역할을 사용할 서비스인 **EC2**를 선택합니다. 사용 사례는 EC2 Role for AWS Systems Manager를 선택한 뒤 다음을 클릭합니다.<br>

   <figure><img src="/files/23lT7EIil3OcFjH09XfR" alt=""><figcaption></figcaption></figure>
3. 권한 정책에 AmazonSSMManagedInstanceCore 정책이 선택되었는지 확인 후 다음을 선택합니다.

<figure><img src="/files/5uNUbaiwqRfvTxxCtOot" alt=""><figcaption></figcaption></figure>

4. **역할 이름**에 **SSMInstanceProfile**를 입력합니다. **역할 생성**를 클릭합니다. 그러면 **역할** 창으로 돌아오게 됩니다. <br>

   <figure><img src="/files/MLfGYES4osqoVFH1y5n9" alt=""><figcaption></figcaption></figure>

### - 기존의 인스턴스에 Systems Manager 인스턴스 프로파일 부착

1. AWS 콘솔창에 접속한 후, Amazon EC2 콘솔 을 엽니다.

<figure><img src="/files/2sqZeEDbyib5dyPsQkZy" alt=""><figcaption></figcaption></figure>

2. **인스턴스** 섹션 아래에 **인스턴스**를 선택합니다. 실습 때 생성한 EC2 인스턴스를 클릭합니다.

<figure><img src="/files/JrkCSK8TzxlV2kwbCeiD" alt=""><figcaption></figcaption></figure>

3. **작업** 메뉴에서 **보안** 선택 후, **IAM 역할 수정**을 클릭합니다.&#x20;

<figure><img src="/files/AJYJErrvKFvooi6Hmx2C" alt=""><figcaption></figcaption></figure>

4. IAM 역할에서 방금 생성한 **SSMInstanceProfile** 인스턴스 프로파일을 선택한 뒤\
   **IAM 역할 업데이트** 버튼을 누릅니다.&#x20;

<figure><img src="/files/sT3NyqjkRNoi6ATcmBFh" alt=""><figcaption></figcaption></figure>

### - Session Managers를 사용하여 리눅스 인스턴스 연결하기

1. EC2 인스턴스 콘솔에서 방금의 인스턴스를 선택한 후, **연결** 버튼을 클릭합니다.&#x20;

<figure><img src="/files/2rWKHWwGlldc234t5C1T" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/FXHlElZVd55FPlXFWiJ1" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
만약 아래와 같은 에러가 발생할 경우, 수초를 기다린 후, 브라우저를 리프레시합니다. EC2 인스턴스가 Session Manager를 사용하기 위한 준비를 하고 있기 때문입니다. 혹은 앞선 페이지에서 인스턴스를 클릭한 후, **인스턴스 상태** 드랍 다운을 클릭한 후, **인스턴스 재부팅**을 클릭합니다.\
인스턴스 재부팅 이후 3분 내외로 Session Manager 사용가능한 상태로 변경됩니다.
{% endhint %}

2. **인스턴스에 연결** 페이지에서 **Session Manager** 탭을 선택합니다. \
   Session Manager 사용에 대한 이점이 담겨있는 **Session Manager 사용** 내용을 검토합니다.

<figure><img src="/files/iB8qu7wR4NEqqwkNitfY" alt=""><figcaption></figcaption></figure>

3. **연결**를 선택합니다. 새로운 세션이 새로운 탭에서 시작될겁니다. 세션이 시작된 후, bash 명령어를 실행할 수 있습니다.&#x20;

<figure><img src="/files/1cHMu3JQM49zy8fdU2pR" alt=""><figcaption></figcaption></figure>

## SSH를  통하여 리눅스 인스턴스에 접근하기

1. EC2 인스턴스 콘솔에서 연결할 인스턴스를 선택한 다음 **연결** 버튼을 클릭합니다.&#x20;

<figure><img src="/files/Q7Sm8VBIfDvG9JbYYboB" alt=""><figcaption></figcaption></figure>

2. 인스턴스에 연결 페이지에서 **SSH 클라이언트** 탭을 누릅니다.

<figure><img src="/files/OTrwb9CCPBPvetNxvB8h" alt=""><figcaption></figcaption></figure>

3. 프라이빗 키가 있는 로컬 디렉토리 위치로 이동하고 다음 명령을 입력합니다.

```
chmod 400 "AWS-ImmersionDay.pem"
ssh -i [AWS-ImmersionDay.pem] ec2-user@[Your Public DNS]
```

4. 연결을 계속 진행할 것인지 묻는 질문에 yes라고 대답한 후, 아래와 같은 결과를 확인할 수 있습니다.

### - Mac

<figure><img src="/files/6qmIRHFUn841aNt3gjNP" alt=""><figcaption></figcaption></figure>

### - Window

* cmd

<figure><img src="/files/SlblsAqJb2AN0wQJdTJ5" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/lG6urMM5WMNV1qGd63O0" alt=""><figcaption></figcaption></figure>

* powershell

<figure><img src="/files/yr5j1oQnDiPBf4bIkbNB" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ENTPxjngjIXi2M6buYzc" alt=""><figcaption></figcaption></figure>

:rotating\_light: 만약 SSH 접근 명령어 실행 시 "Permission denied (publickey,gssapi-keyex,gssapi-with-mic)." 와 같은 권한 오류가 발생한다면, 아래의 과정을 통하여 권한 설정을 실행합니다.

* pem 키가 위치한 곳으로 이동 후 pem \[파일 우클릭] -> \[속성] -> \[보안] -> \[고급] -> \[SYSTEM, Admin 제외 나머지 사용 권한 제거]

<figure><img src="/files/u93lggycPsL7OvgLSUDy" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/jBhv09jVXgkmpWswgHHG" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/lUWoFzAyyY1eXt8Ay3dN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/r7EWturoEOGOKRBfXWWx" alt=""><figcaption></figcaption></figure>

사용 권한 제거 후 SYSTEM, Administrators 만 권한 설정에 유지되어야 합니다.

## Cloud Watch Agent 설치

CloudWatch Agent는 AWS의 모니터링 서비스인 Amazon CloudWatch와 함께 사용되는 소프트웨어입니다.\
CloudWatch에서 기본으로 제공하는 모니터링 외에 추가로 메모리, 디스크 사용량 등 더 많은 지표들을 수집하기 위하여 설치합니다. 해당 서비스 사용 시 추가비용이 발생하지만 더 많은 지표들을 추가할 수 있어 원활한 모니터링 운영에 도움이 되는 소프트웨어 입니다.

### - IAM Role 생성

1. AWS 콘솔창에 접속한 후 IAM 콘솔 을 엽니다. 네비게이션 항목에서 이전 실습에서 생성한 **SSMInstanceProfile역할**클릭합니다.&#x20;

<figure><img src="/files/qT95Cv0Pn08IEm5FRo16" alt=""><figcaption></figcaption></figure>

2. 권한추가를 선택하여 **CloudWatchAgentServerPolicy 정책**을 추가합니다.

<figure><img src="/files/vrGB4hGmy4MNgWNauZqZ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/gtTqobj3iSpELcFJAG97" alt=""><figcaption></figcaption></figure>

### - EC2 인스턴스에 CloudWatch Agent 설치

1. CloudWatch Agent 설치를 위하여 Session manager 혹은 SSH 접속을 통하여 인스턴스에 접근합니다.\
   이후 아래의 명령어를 통하여 CloudWatch Agent를 설치합니다.

<pre><code><strong>sudo su
</strong><strong>yum install -y amazon-cloudwatch-agent
</strong></code></pre>

2. 설치가 완료된 후 구성 파일 생성 시, 위자드를 사용해 구성파일을 생성합니다.

```
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```

<figure><img src="/files/UmzyIlQngr6XLhG1KDq5" alt=""><figcaption></figcaption></figure>

매트릭 수집 설정

&#x20;\- Basic: 사용량(used\_percent)\
&#x20;\- Standard: Basic 지표에 CPU 대기시간(cpu\_usage\_iowait), 디스크IO 시간(diskio\_io\_time) 등 추가\
&#x20;\- Advanced: Standard 지표에 Disk 읽기, 쓰기양(diskio\_write\_bytes, diskio\_read\_bytes) 등 추가

```
<ubuntu>
wget https://amazoncloudwatch-agent.s3.amazonaws.com/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```

{% hint style="info" %}
해당 설정 파일은 /opt/aws/amazon-cloudwatch-agent/bin/config.json 위치에 저장되며, \
필요한 경우 이 파일을 직접 편집하여 설정을 수정할 수 있습니다.
{% endhint %}

3. 아래의 명령어를 사용하여 CloudWatch Agent 파일 실행합니다.

```
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
systemctl status amazon-cloudwatch-agent.service
```

서비스 실행 후 약 5분 이내로 CloudWatch에서 해당 인스턴스에 대한 메모리 및 디스크에 대한 지표 확인이 가능합니다.

<figure><img src="/files/uW4AVGTScZ32IOXoLEoZ" alt=""><figcaption></figcaption></figure>

## 부하테스트를 통한 모니터링

1. System Manager 혹은 SSH 를 통하여 **Web server for IMD 인스턴스에 접속합니다.**

<figure><img src="/files/T2CF4NU8XJ1Sl4fz2vCc" alt=""><figcaption></figcaption></figure>

2. 루트 사용자 권한으로 변경한 후 아래의 명령어를 통하여 인스턴스에 메모리 및 디스크에 부하를 실행시킵니다.<br>

<pre><code><strong>yum install stress -y
</strong>stress --vm 1 --vm-bytes 600m --hdd 4 --timeout 120s
</code></pre>

아래와 같은 실패 문구가 나온다면 메모리 부족으로 인한 OOM(Out Of Memory)이 발생할 수 있습니다.

<figure><img src="/files/81zgh9q97Zh8CuFGmlpb" alt=""><figcaption></figcaption></figure>

아래의 명령어를 통하여 Out Of Memory 관련 에러가 발생했는지 확인 할 수 있습니다.

```
dmesg
```

<figure><img src="/files/nMEWnYZQU5yleER4jw0N" alt=""><figcaption></figcaption></figure>

3. "Successful run complated"라는 문구를 확인하였다면, \
   CloudWatch 콘솔로 이동하여 부하가 발생한 시점의 메모리 및 디스크의 지표를 확인합니다.

<figure><img src="/files/r1xo50cZbd8D6nMPZqv3" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://workshop.habeen.me/ec2-session-hands-on-lab.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
