

# AWS CLI에서 Amazon EC2 사용
<a name="cli-services-ec2"></a>


| Amazon Elastic Compute Cloud 소개 | 
| --- | 
|  [![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/TsRBftzZsQo/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/TsRBftzZsQo)  | 

Amazon Elastic Compute Cloud(Amazon EC2)는 확장성과 유연성이 뛰어난 가상 컴퓨팅 환경을 제공합니다. Amazon EC2를 사용하면 다양한 컴퓨팅 요구 사항을 충족하기 위해 Amazon EC2 인스턴스라고 하는 가상 서버를 프로비저닝하고 관리할 수 있습니다.

Amazon EC2 인스턴스는 CPU, 메모리, 스토리지 및 네트워킹 기능의 다양한 구성으로 사용자 지정할 수 있는 가상 머신입니다. 애플리케이션 요구 사항에 따라 가볍고 비용 효율적인 옵션부터 강력한 고성능 인스턴스까지 다양한 인스턴스 유형 중에서 선택할 수 있습니다. 이러한 유연성을 통해 컴퓨팅 요구 사항을 충족하여 성능과 비용 효율성을 최적화할 수 있습니다.

또한 Amazon EC2는 컴퓨팅 리소스를 효과적으로 관리할 수 있는 다양한 기능을 제공합니다. 여기에는 새 인스턴스를 빠르게 시작하고, 신속한 배포를 위해 사용자 지정 머신 이미지(AMI)를 생성하고, 필요에 따라 컴퓨팅 용량을 늘리거나 줄일 수 있는 기능이 포함됩니다.

AWS Command Line Interface(AWS CLI)를 사용하여 Amazon EC2의 기능에 액세스할 수 있습니다. Amazon EC2에 대한 AWS CLI 명령을 나열하려면 다음 명령을 사용합니다.

```
aws ec2 help
```

명령을 실행하기 전에 기본 자격 증명을 설정합니다. 자세한 내용은 [AWS CLI 설정 구성](cli-chap-configure.md) 섹션을 참조하세요.

이 주제에서는 Amazon EC2에 대한 일반적인 태스크를 수행하는 짧은 형식의 AWS CLI 명령 예제를 보여줍니다.

긴 형식의 AWS CLI 명령 예제는 *GitHub*에서 [AWS CLI 코드 예제 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli)를 참조하세요.

**Topics**
+ [AWS CLI에서 Amazon EC2 키 페어 생성, 표시 및 삭제](cli-services-ec2-keypairs.md)
+ [AWS CLI에서 Amazon EC2 보안 그룹 생성, 구성 및 삭제](cli-services-ec2-sg.md)
+ [AWS CLI에서 Amazon EC2 인스턴스 시작, 나열 및 삭제](cli-services-ec2-instances.md)
+ [AWS CLI에서 bash 스크립트로 Amazon EC2 인스턴스 유형 변경](cli-services-ec2-instance-type-script.md)

# AWS CLI에서 Amazon EC2 키 페어 생성, 표시 및 삭제
<a name="cli-services-ec2-keypairs"></a>

AWS Command Line Interface(AWS CLI)를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2)에 대한 키 페어를 생성, 표시 및 삭제할 수 있습니다. 키 페어를 사용하여 Amazon EC2 인스턴스에 연결합니다. 인스턴스를 생성할 때 Amazon EC2에 키 페어를 제공한 다음, 인스턴스에 연결할 때 해당 키 페어를 사용하여 인증할 수 있습니다.

**참고**  
추가 명령 예제는 [AWS CLI 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

**Topics**
+ [사전 조건](#cli-services-ec2-keypairs-prereqs)
+ [키 페어 생성](#creating-a-key-pair)
+ [키 페어 표시](#displaying-a-key-pair)
+ [키 페어 삭제](#deleting-a-key-pair)
+ [참조](#cli-services-ec2-keypairs-references)

## 사전 조건
<a name="cli-services-ec2-keypairs-prereqs"></a>

`ec2` 명령을 실행하려면 다음을 수행해야 합니다.
+ AWS CLI를 설치하고 구성합니다. 자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](getting-started-install.md) 및 [AWS CLI에 대한 인증 및 액세스 보안 인증](cli-chap-authentication.md) 섹션을 참조하세요.
+ Amazon EC2 액세스를 허용하도록 IAM 권한을 설정합니다. Amazon EC2의 IAM 권한에 대한 자세한 내용은 **Amazon EC2 사용 설명서의 [Amazon EC2에 대한 IAM 정책](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)을 참조하세요.

## 키 페어 생성
<a name="creating-a-key-pair"></a>

키 페어를 생성하려면 `[aws ec2 create-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html)` 명령과 함께 `--query` 옵션 및 `--output text` 옵션을 사용하여 프라이빗 키를 직접 파일에 파이프합니다.

```
$ aws ec2 create-key-pair --key-name MyKeyPair --query 'KeyMaterial' --output text > MyKeyPair.pem
```

PowerShell의 경우 `> file` 리디렉션이 UTF-8 인코딩으로 기본 지정되는데, 일부 SSH 클라이언트에서는 이 인코딩을 사용할 수 없습니다. 따라서 `out-file` 명령으로 파이프하여 출력을 변환하고, 명시적으로 인코딩을 `ascii`로 설정해야 합니다.

```
PS C:\>aws ec2 create-key-pair --key-name MyKeyPair --query 'KeyMaterial' --output text | out-file -encoding ascii -filepath MyKeyPair.pem
```

결과로 나온 `MyKeyPair.pem` 파일은 다음과 같습니다.

```
-----BEGIN RSA PRIVATE KEY-----
EXAMPLEKEYKCAQEAy7WZhaDsrA1W3mRlQtvhwyORRX8gnxgDAfRt/gx42kWXsT4rXE/b5CpSgie/
vBoU7jLxx92pNHoFnByP+Dc21eyyz6CvjTmWA0JwfWiW5/akH7iO5dSrvC7dQkW2duV5QuUdE0QW
Z/aNxMniGQE6XAgfwlnXVBwrerrQo+ZWQeqiUwwMkuEbLeJFLhMCvYURpUMSC1oehm449ilx9X1F
G50TCFeOzfl8dqqCP6GzbPaIjiU19xX/azOR9V+tpUOzEL+wmXnZt3/nHPQ5xvD2OJH67km6SuPW
oPzev/D8V+x4+bHthfSjR9Y7DvQFjfBVwHXigBdtZcU2/wei8D/HYwIDAQABAoIBAGZ1kaEvnrqu
/uler7vgIn5m7lN5LKw4hJLAIW6tUT/fzvtcHK0SkbQCQXuriHmQ2MQyJX/0kn2NfjLV/ufGxbL1
mb5qwMGUnEpJaZD6QSSs3kICLwWUYUiGfc0uiSbmJoap/GTLU0W5Mfcv36PaBUNy5p53V6G7hXb2
bahyWyJNfjLe4M86yd2YK3V2CmK+X/BOsShnJ36+hjrXPPWmV3N9zEmCdJjA+K15DYmhm/tJWSD9
81oGk9TopEp7CkIfatEATyyZiVqoRq6k64iuM9JkA3OzdXzMQexXVJ1TLZVEH0E7bhlY9d8O1ozR
oQs/FiZNAx2iijCWyv0lpjE73+kCgYEA9mZtyhkHkFDpwrSM1APaL8oNAbbjwEy7Z5Mqfql+lIp1
YkriL0DbLXlvRAH+yHPRit2hHOjtUNZh4Axv+cpg09qbUI3+43eEy24B7G/Uh+GTfbjsXsOxQx/x
p9otyVwc7hsQ5TA5PZb+mvkJ5OBEKzet9XcKwONBYELGhnEPe7cCgYEA06Vgov6YHleHui9kHuws
ayav0elc5zkxjF9nfHFJRry21R1trw2Vdpn+9g481URrpzWVOEihvm+xTtmaZlSp//lkq75XDwnU
WA8gkn6O3QE3fq2yN98BURsAKdJfJ5RL1HvGQvTe10HLYYXpJnEkHv+Unl2ajLivWUt5pbBrKbUC
gYBjbO+OZk0sCcpZ29sbzjYjpIddErySIyRX5gV2uNQwAjLdp9PfN295yQ+BxMBXiIycWVQiw0bH
oMo7yykABY7Ozd5wQewBQ4AdSlWSX4nGDtsiFxWiI5sKuAAeOCbTosy1s8w8fxoJ5Tz1sdoxNeGs
Arq6Wv/G16zQuAE9zK9vvwKBgF+09VI/1wJBirsDGz9whVWfFPrTkJNvJZzYt69qezxlsjgFKshy
WBhd4xHZtmCqpBPlAymEjr/TOlbxyARmXMnIOWIAnNXMGB4KGSyl1mzSVAoQ+fqR+cJ3d0dyPl1j
jjb0Ed/NY8frlNDxAVHE8BSkdsx2f6ELEyBKJSRr9snRAoGAMrTwYneXzvTskF/S5Fyu0iOegLDa
NWUH38v/nDCgEpIXD5Hn3qAEcju1IjmbwlvtW+nY2jVhv7UGd8MjwUTNGItdb6nsYqM2asrnF3qS
VRkAKKKYeGjkpUfVTrW0YFjXkfcrR/V+QFL5OndHAKJXjW7a4ejJLncTzmZSpYzwApc=
-----END RSA PRIVATE KEY-----
```

프라이빗 키가 AWS에 저장되지 않고 이 키가 ***생성될 때만*** 검색할 수 있습니다. 나중에 복구할 수 없습니다. 대신, 프라이빗 키를 잃어버리면 새 키 페어를 생성해야 합니다.

Linux 컴퓨터에서 인스턴스에 연결하는 경우, 사용자만 프라이빗 키 파일을 읽을 수 있도록 다음 명령으로 해당 권한을 설정하는 것이 좋습니다.

```
$ chmod 400 MyKeyPair.pem
```

## 키 페어 표시
<a name="displaying-a-key-pair"></a>

키 페어에서 "지문"이 생성되고 이 지문을 사용하여 로컬 시스템에 있는 프라이빗 키가 AWS에 저장된 퍼블릭 키와 일치하는지 확인할 수 있습니다.

지문은 프라이빗 키의 DER 인코딩된 사본에서 가져온 SHA1 해시입니다. 이 값은 키 페어가 생성될 때 캡처되어 퍼블릭 키와 함께 AWS에 저장됩니다. Amazon EC2 콘솔에서 또는 AWS CLI 명령 `[aws ec2 describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html)`를 실행하여 지문을 볼 수 있습니다.

다음 예제는 `MyKeyPair`의 지문을 표시합니다.

```
$ aws ec2 describe-key-pairs --key-name MyKeyPair
{
    "KeyPairs": [
        {
            "KeyName": "MyKeyPair",
            "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"
        }
    ]
}
```

키 및 지문에 대한 자세한 내용은 **Amazon EC2 사용 설명서의 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요.

## 키 페어 삭제
<a name="deleting-a-key-pair"></a>

키 페어를 삭제하려면 *`MyKeyPair`*를 삭제할 페어의 이름으로 바꾸어 `[aws ec2 delete-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html)` 명령을 실행합니다.

```
$ aws ec2 delete-key-pair --key-name MyKeyPair
```

## 참조
<a name="cli-services-ec2-keypairs-references"></a>

**AWS CLI 참조:** 
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 create-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html)`
+ `[aws ec2 delete-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html)`
+ `[aws ec2 describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html)`

**기타 참조:**
+ [Amazon Elastic Compute Cloud 설명서](https://docs.aws.amazon.com/ec2/)
+ AWS SDK 및 AWS CLI 코드 예제를 보고 기여하려면 *GitHub*에서 [AWS 코드 예제 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/)를 참조하세요.

# AWS CLI에서 Amazon EC2 보안 그룹 생성, 구성 및 삭제
<a name="cli-services-ec2-sg"></a>

기본적으로 방화벽 역할을 하는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 대한 보안 그룹과 함께, 들어오고 나가는 네트워크 트래픽을 결정하는 규칙을 생성할 수 있습니다.

AWS Command Line Interface(AWS CLI)를 사용하여 새 보안 그룹을 만들고, 기존 보안 그룹에 규칙을 추가하고, 보안 그룹을 삭제합니다.

**참고**  
추가 명령 예제는 [AWS CLI 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

**Topics**
+ [사전 조건](#cli-services-ec2-sg-prereqs)
+ [보안 그룹 생성](#creating-a-security-group)
+ [보안 그룹에 규칙 추가](#configuring-a-security-group)
+ [보안 그룹 삭제](#deleting-a-security-group)
+ [참조](#cli-services-ec2-sg-references)

## 사전 조건
<a name="cli-services-ec2-sg-prereqs"></a>

`ec2` 명령을 실행하려면 다음을 수행해야 합니다.
+ AWS CLI를 설치하고 구성합니다. 자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](getting-started-install.md) 및 [AWS CLI에 대한 인증 및 액세스 보안 인증](cli-chap-authentication.md) 섹션을 참조하세요.
+ Amazon EC2 액세스를 허용하도록 IAM 권한을 설정합니다. Amazon EC2의 IAM 권한에 대한 자세한 내용은 **Amazon EC2 사용 설명서의 [Amazon EC2에 대한 IAM 정책](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)을 참조하세요.

## 보안 그룹 생성
<a name="creating-a-security-group"></a>

Virtual Private Cloud(VPC)와 관련된 보안 그룹을 생성할 수 있습니다.

다음 `[aws ec2 create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html)` 예제에서는 지정된 VPC에 대한 보안 그룹을 생성하는 방법을 보여줍니다.

```
$ aws ec2 create-security-group --group-name my-sg --description "My security group" --vpc-id vpc-1a2b3c4d
{
    "GroupId": "sg-903004f8"
}
```

보안 그룹에 대한 초기 정보를 보려면 `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)` 명령을 실행합니다. EC2-VPC 보안 그룹은 이름이 아닌 `vpc-id`를 통해서만 참조할 수 있습니다.

```
$ aws ec2 describe-security-groups --group-ids sg-903004f8
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": []
                }
            ],
            "Description": "My security group"
            "IpPermissions": [],
            "GroupName": "my-sg",
            "VpcId": "vpc-1a2b3c4d",
            "OwnerId": "123456789012",
            "GroupId": "sg-903004f8"
        }
    ]
}
```

## 보안 그룹에 규칙 추가
<a name="configuring-a-security-group"></a>

Amazon EC2 인스턴스를 실행할 때 이미지에 연결하는 방법에 맞는 수신 네트워크 트래픽을 허용하려면 보안 그룹의 규칙을 활성화해야 합니다.

예를 들어 Windows 인스턴스를 시작할 경우, RDP(Remote Desktop Protocol)를 지원하기 위해 일반적으로 TCP 포트 3389에서 인바운드 트래픽을 허용하는 규칙을 추가합니다. Linux 인스턴스를 시작할 경우, SSH 연결을 지원하기 위해 일반적으로 TCP 포트 22에서 인바운드 트래픽을 허용하는 규칙을 추가합니다.

`[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)` 명령을 사용하여 보안 그룹에 규칙을 추가합니다. 이 명령의 필수 파라미터가 컴퓨터 또는 컴퓨터가 연결된 네트워크(주소 범위의 형식)의 퍼블릭 IP 주소([CIDR](https://wikipedia.org/wiki/Classless_Inter-Domain_Routing) 표기법 사용)입니다.

**참고**  
다음 서비스를 제공합니다. [https://checkip.global.api.aws/](https://checkip.global.api.aws/)으로 퍼블릭 IP 주소 확인을 활성화할 수 있습니다. IP 주소를 식별하는 데 도움이 되는 다른 서비스를 찾으려면 브라우저를 사용하여 "*내 IP 주소*"를 검색합니다. 동적 IP 주소를 사용하여(프라이빗 네트워크의 NAT 게이트웨이를 통해) 방화벽 뒤에서 연결하거나 ISP를 통해 연결하면 주소가 주기적으로 변경될 수 있습니다. 이 경우 클라이언트 컴퓨터에서 사용하는 IP 주소 범위를 알아야 합니다.

다음 예제에서는 사용자의 IP 주소를 사용하여 ID가 `sg-903004f8`인 EC2-VPC 보안 그룹에 RDP(TCP 포트 3389)에 대한 규칙을 추가하는 방법을 보여줍니다.

시작하려면 IP 주소를 찾습니다.

```
$ curl https://checkip.amazonaws.com
x.x.x.x
```

그런 다음 `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)` 명령을 실행하여 IP 주소를 보안 그룹에 추가할 수 있습니다.

```
$ aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 3389 --cidr x.x.x.x/x
```

다음 명령은 동일한 보안 그룹의 인스턴스에 SSH를 활성화하는 다른 규칙을 추가합니다.

```
$ aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 22 --cidr x.x.x.x/x
```

보안 그룹의 변경 사항을 보려면 `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)` 명령을 실행합니다.

```
$ aws ec2 describe-security-groups --group-ids sg-903004f8
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": []
                }
            ],
            "Description": "My security group"
            "IpPermissions": [
                {
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "x.x.x.x/x"
                        }
                    ]
                    "UserIdGroupPairs": [],
                    "FromPort": 22
                }
            ],
            "GroupName": "my-sg",
            "OwnerId": "123456789012",
            "GroupId": "sg-903004f8"
        }
    ]
}
```

## 보안 그룹 삭제
<a name="deleting-a-security-group"></a>

보안 그룹을 삭제하려면 `[aws ec2 delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html)` 명령을 실행합니다.

**참고**  
환경에 현재 연결되어 있는 경우 보안 그룹을 삭제할 수 없습니다.

다음 명령 예제는 EC2-VPC 보안 그룹을 삭제합니다.

```
$ aws ec2 delete-security-group --group-id sg-903004f8
```

## 참조
<a name="cli-services-ec2-sg-references"></a>

**AWS CLI 참조:** 
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)`
+ `[aws ec2 create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html)`
+ `[aws ec2 delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html)`
+ `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)`

**기타 참조:**
+ [Amazon Elastic Compute Cloud 설명서](https://docs.aws.amazon.com/ec2/)
+ AWS SDK 및 AWS CLI 코드 예제를 보고 기여하려면 *GitHub*에서 [AWS 코드 예제 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/)를 참조하세요.

# AWS CLI에서 Amazon EC2 인스턴스 시작, 나열 및 삭제
<a name="cli-services-ec2-instances"></a>

AWS Command Line Interface(AWS CLI)를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 시작, 나열 및 삭제할 수 있습니다. 시작하는 인스턴스가 AWS 프리 티어에 해당되지 않는 경우 인스턴스를 시작한 후에 요금이 청구되고 유휴 상태를 포함해 인스턴스가 실행된 시간에 대해 과금됩니다.

**참고**  
추가 명령 예제는 [AWS CLI 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

**Topics**
+ [사전 조건](#cli-services-ec2-instances-prereqs)
+ [인스턴스 시작](#launching-instances)
+ [인스턴스에 블록 디바이스 추가](#block-device-mapping)
+ [인스턴스에 태그 추가](#tagging-instances)
+ [인스턴스에 연결합니다](#connecting-to-instances)
+ [인스턴스 나열](#listing-instances)
+ [인스턴스 삭제](#terminating-instances)
+ [참조](#cli-services-ec2-instances-references)

## 사전 조건
<a name="cli-services-ec2-instances-prereqs"></a>

이 주제의 `ec2` 명령을 실행하려면 다음을 수행해야 합니다.
+ AWS CLI를 설치하고 구성합니다. 자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](getting-started-install.md) 및 [AWS CLI에 대한 인증 및 액세스 보안 인증](cli-chap-authentication.md) 섹션을 참조하세요.
+ Amazon EC2 액세스를 허용하도록 IAM 권한을 설정합니다. Amazon EC2의 IAM 권한에 대한 자세한 내용은 **Amazon EC2 사용 설명서의 [Amazon EC2에 대한 IAM 정책](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)을 참조하세요.
+ [키 페어](cli-services-ec2-keypairs.md) 및 [보안 그룹](cli-services-ec2-sg.md)을 생성합니다.
+ Amazon Machine Image(AMI)를 선택하고 AMI ID를 기록합니다. 자세한 내용은 [https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html)Amazon EC2 사용 설명서의 *적합한 AMI 찾기*를 참조하세요.

## 인스턴스 시작
<a name="launching-instances"></a>

선택한 AMI를 사용하여 Amazon EC2 인스턴스를 시작하려면 `[aws ec2 run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)` 명령을 사용합니다. Virtual Private Cloud(VPC)에서 인스턴스를 시작할 수 있습니다.

처음에는 인스턴스가 `pending` 상태로 표시되지만 몇 분 후에 `running` 상태로 변경됩니다.

다음 예제는 지정한 VPC 서브넷에서 `t2.micro` 인스턴스를 시작하는 방법을 보여줍니다. *기울임꼴* 파라미터 값을 사용자의 값으로 바꾸세요.

```
$ aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids sg-903004f8 --subnet-id subnet-6e7f829e
{
    "OwnerId": "123456789012",
    "ReservationId": "r-5875ca20",
    "Groups": [
        {
            "GroupName": "my-sg",
            "GroupId": "sg-903004f8"
        }
    ],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": null,
            "Platform": "windows",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2013-07-19T02:42:39.000Z",
            "PrivateIpAddress": "10.0.1.114",
            "ProductCodes": [],
            "VpcId": "vpc-1a2b3c4d",
            "InstanceId": "i-5203422c",
            "ImageId": "ami-173d747e",
            "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
            "KeyName": "MyKeyPair",
            "SecurityGroups": [
                {
                    "GroupName": "my-sg",
                    "GroupId": "sg-903004f8"
                }
            ],
            "ClientToken": null,
            "SubnetId": "subnet-6e7f829e",
            "InstanceType": "t2.micro",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-1a2b3c4d",
                    "Description": "Primary network interface",
                    "NetworkInterfaceId": "eni-a7edb1c9",
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                            "Primary": true,
                            "PrivateIpAddress": "10.0.1.114"
                        }
                    ],
                    "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                    "Attachment": {
                        "Status": "attached",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-52193138",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "my-sg",
                            "GroupId": "sg-903004f8"
                        }
                    ],
                    "SubnetId": "subnet-6e7f829e",
                    "OwnerId": "123456789012",
                    "PrivateIpAddress": "10.0.1.114"
                }              
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": null,
                "AvailabilityZone": "us-west-2b"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "Status": "attached",
                        "DeleteOnTermination": true,
                        "VolumeId": "vol-877166c8",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    }
                }              
            ],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "RootDeviceName": "/dev/sda1",
            "VirtualizationType": "hvm",
            "RootDeviceType": "ebs",
            "Tags": [
                {
                    "Value": "MyInstance",
                    "Key": "Name"
                }
            ],
            "AmiLaunchIndex": 0
        }
    ]
}
```

## 인스턴스에 블록 디바이스 추가
<a name="block-device-mapping"></a>

실행된 각 인스턴스에는 연관된 루트 디바이스 볼륨이 있습니다. 블록 디바이스 매핑을 사용하면 실행될 때 인스턴스에 연결할 추가 Amazon Elastic Block Store(Amazon EBS) 볼륨 또는 인스턴스 스토어 볼륨을 지정할 수 있습니다.

인스턴스에 블록 디바이스를 추가하려면 `--block-device-mappings`를 사용할 때 `run-instances` 옵션을 지정합니다.

다음 예제 파라미터는 크기가 20GB인 표준 Amazon EBS 볼륨을 프로비저닝하고, 식별자 `/dev/sdf`를 사용하여 인스턴스에 이를 매핑합니다.

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false}}]"
```

다음 예제에서는 기존 스냅샷을 기반으로 `/dev/sdf`에 매핑된 Amazon EBS 볼륨을 추가합니다. 스냅샷은 볼륨에 로드되는 이미지를 나타냅니다. 스냅샷을 지정할 때 볼륨 크기를 지정할 필요가 없습니다. 이미지를 담을 만큼 충분히 큽니다. 그러나 크기를 지정하는 경우 스냅샷의 크기보다 크거나 같아야 합니다.

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"Ebs\":{\"SnapshotId\":\"snap-a1b2c3d4\"}}]"
```

다음 예제에서는 인스턴스에 두 개의 볼륨을 추가합니다. 인스턴스에 사용 가능한 볼륨 수는 인스턴스 유형에 따라 다릅니다.

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"VirtualName\":\"ephemeral0\"},{\"DeviceName\":\"/dev/sdg\",\"VirtualName\":\"ephemeral1\"}]"
```

다음 예제에서는 매핑(`/dev/sdj`)을 생성하지만 인스턴스에 볼륨을 프로비저닝하지 않습니다.

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdj\",\"NoDevice\":\"\"}]"
```

자세한 내용은 *Amazon EC2 사용 설명서*의 [블록 디바이스 매핑](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html)을 참조하세요.

## 인스턴스에 태그 추가
<a name="tagging-instances"></a>

태그는 AWS 리소스에 할당하는 레이블입니다. 이를 통해 다양한 용도로 사용할 수 있는 메타데이터를 리소스에 추가할 수 있습니다. 자세한 내용은 **Amazon EC2 사용 설명서의 [리소스에 태그 지정](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)을 참조하세요.

다음 예제에서는 `[aws ec2 create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html)` 명령을 사용하여 키 이름이 "`Name`"이고 값이 "`MyInstance`"인 태그를 지정된 인스턴스에 추가하는 방법을 보여줍니다.

```
$ aws ec2 create-tags --resources i-5203422c --tags Key=Name,Value=MyInstance
```

## 인스턴스에 연결합니다
<a name="connecting-to-instances"></a>

인스턴스가 실행될 때 실행 중인 인스턴스에 연결하여 바로 앞에 있는 컴퓨터를 사용하는 것처럼 인스턴스를 사용할 수 있습니다. 자세한 내용은 **Amazon EC2 사용 설명서의 [Amazon EC2 인스턴스에 연결](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)을 참조하세요.

## 인스턴스 나열
<a name="listing-instances"></a>

AWS CLI를 사용하여 인스턴스를 나열하고 정보를 확인할 수 있습니다. 모든 인스턴스를 나열하거나 관심이 있는 인스턴스에 따라 결과를 필터링할 수 있습니다.

다음 예제에서는 `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)` 명령을 사용하는 방법을 보여줍니다.

다음 명령은 모든 인스턴스를 나열합니다.

```
$ aws ec2 describe-instances
```

다음 명령은 목록을 `t2.micro` 인스턴스로만 필터링하고 각 매치에 대한 `InstanceId` 값만 출력합니다.

```
$ aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro" --query "Reservations[].Instances[].InstanceId"
[
    "i-05e998023d9c69f9a"
]
```

다음 명령은 `Name=MyInstance` 태그가 있는 인스턴스를 나열합니다.

```
$ aws ec2 describe-instances --filters "Name=tag:Name,Values=MyInstance"
```

다음 명령은 `ami-x0123456`, `ami-y0123456` 및 `ami-z0123456` AMI를 사용해 시작된 인스턴스를 나열합니다.

```
$ aws ec2 describe-instances --filters "Name=image-id,Values=ami-x0123456,ami-y0123456,ami-z0123456"
```

## 인스턴스 삭제
<a name="terminating-instances"></a>

더 이상 필요하지 않은 경우 AWS CLI를 사용하여 Amazon EC2 인스턴스를 종료(삭제)할 수 있습니다.

**중요**  
**인스턴스 종료는 영구적이며 취소할 수 없습니다.**  
종료한 인스턴스는 더 이상 연결할 수 없으며 복구할 수 없습니다. 연결된 Amazon EBS 볼륨도 종료 시 삭제하도록 구성한 경우 영구적으로 삭제되며 복구할 수 없습니다. 인스턴스 저장소 볼륨에 저장된 데이터는 모두 영구적으로 손실됩니다. 자세한 내용은 [인스턴스 종료 작동 방식](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/how-ec2-instance-termination-works.html)식을 참조하세요.  
인스턴스를 종료하기 전에 종료 후에도 보존해야 하는 모든 데이터를 영구 스토리지에 백업했는지 확인하세요.

인스턴스 상태가 `shutting-down` 또는 `terminated`로 변경되는 즉시 해당 인스턴스에 대한 반복적인 요금 부과가 중단됩니다. 나중에 인스턴스에 다시 연결하려면 `terminate-instances` 대신 [stop-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/stop-instances.html)를 사용합니다. 자세한 내용은 *Amazon EC2 사용 설명서*의 [인스턴스 종료](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)를 참조하세요.

다음 예제에서는 `[aws ec2 terminate-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html)` 명령을 사용하여 인스턴스를 삭제하는 방법을 보여줍니다.

```
$ aws ec2 terminate-instances --instance-ids i-5203422c
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-5203422c",
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
```

## 참조
<a name="cli-services-ec2-instances-references"></a>

**AWS CLI 참조:** 
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html)`
+ `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)`
+ `[aws ec2 run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)`
+ `[aws ec2 terminate-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html)`

**기타 참조:**
+ [Amazon Elastic Compute Cloud 설명서](https://docs.aws.amazon.com/ec2/)
+ AWS SDK 및 AWS CLI 코드 예제를 보고 기여하려면 *GitHub*에서 [AWS 코드 예제 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/)를 참조하세요.

# AWS CLI에서 bash 스크립트로 Amazon EC2 인스턴스 유형 변경
<a name="cli-services-ec2-instance-type-script"></a>

Amazon EC2에 대한 이 bash 스크립팅 예제에서는 AWS Command Line Interface(AWS CLI)를 사용하여 Amazon EC2 인스턴스의 인스턴스 유형을 변경합니다. 인스턴스가 실행 중인 경우 인스턴스를 중지하고, 인스턴스 유형을 변경한 다음, 요청된 경우 인스턴스를 다시 시작합니다. 셸 스크립트는 명령줄 인터페이스에서 실행되도록 설계된 프로그램입니다.

**참고**  
추가 명령 예제는 [AWS CLI 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

**Topics**
+ [시작하기 전에](#cli-services-ec2-instance-type-script-prereqs)
+ [이 예제 정보](#cli-services-ec2-instance-type-script-about)
+ [파라미터](#cli-services-ec2-instance-type-script-params)
+ [파일](#cli-services-ec2-instance-type-script-files.title)
+ [참조](#cli-services-ec2-instance-type-script-references)

## 시작하기 전에
<a name="cli-services-ec2-instance-type-script-prereqs"></a>

아래 예제 중 하나를 실행하려면 먼저 다음 작업을 완료해야 합니다.
+ AWS CLI를 설치하고 구성합니다. 자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](getting-started-install.md) 및 [AWS CLI에 대한 인증 및 액세스 보안 인증](cli-chap-authentication.md) 섹션을 참조하세요.
+ 사용하는 프로파일에는 예제에서 수행하는 AWS 작업을 허용하는 권한이 있어야 합니다.
+ 중지 및 수정 권한이 있는 계정에서 실행 중인 Amazon EC2 인스턴스입니다. 테스트 스크립트를 실행하면 테스트 스크립트가 인스턴스를 시작하고 유형을 변경하여 인스턴스를 테스트한 다음 인스턴스를 종료합니다.
+ AWS 모범 사례로서 이 코드에 최소 권한을 부여하거나 태스크를 수행하는 데 필요한 권한만 부여하세요. 자세한 내용은 *AWS Identity and Access Management(IAM) 사용 설명서*에서 [최소 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)를 참조하세요.
+ 이 코드는 일부 AWS 리전에서 테스트되지 않았습니다. 일부 AWS 서비스는 특정 리전에서만 사용할 수 있습니다. 자세한 내용은 *AWS 일반 참조 안내서*에서 [서비스 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)을 참조하세요.
+ 이 코드를 실행하면 AWS 계정에 요금이 발생할 수 있습니다. 이 스크립트에 의해 생성된 모든 리소스를 사용한 후 제거하는 것은 사용자의 책임입니다.

## 이 예제 정보
<a name="cli-services-ec2-instance-type-script-about"></a>

이 예제는 다른 스크립트나 명령줄에서 `change_ec2_instance_type.sh`할 수 있는 셸 스크립트 파일 `source`의 함수로 작성됩니다. 각 스크립트 파일에는 각 함수를 설명하는 주석이 들어 있습니다. 함수가 메모리에 있으면 명령줄에서 함수를 호출할 수 있습니다. 예를 들어, 다음 명령은 지정된 인스턴스의 유형을 `t2.nano`로 변경합니다.

```
$ source ./change_ec2_instance_type.sh
$ ./change_ec2_instance_type -i *instance-id* -t new-type
```

전체 예제 및 다운로드 가능한 스크립트 파일은 *GitHub*에서 *AWS 코드 예제 리포지토리*의 [Amazon EC2 인스턴스 유형 변경](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/ec2/change-ec2-instance-type)을 참조하세요.

## 파라미터
<a name="cli-services-ec2-instance-type-script-params"></a>

**-i** - *(문자열)* 수정할 인스턴스 ID를 지정합니다.

**-t** - *(문자열)* 전환할 Amazon EC2 인스턴스 유형을 지정합니다.

**-r** - *(스위치)* 기본적으로 설정되지 않습니다. `-r`이 설정된 경우 유형 스위치 뒤에 인스턴스를 다시 시작합니다.

**-f** - *(스위치)* 기본적으로 스크립트는 스위치를 만들기 전에 인스턴스를 종료할지 확인하는 메시지를 사용자에게 표시합니다. `-f`가 설정된 경우, 함수는 유형 스위치를 만들기 위해 인스턴스를 종료하기 전에 사용자에게 메시지를 표시하지 않습니다

**-v** - *(스위치)* 기본적으로 스크립트는 자동으로 작동하며 오류가 발생한 경우에만 출력을 표시합니다. `-v`가 설정된 경우 함수는 작업 전체 상태를 표시합니다.

## 파일
<a name="cli-services-ec2-instance-type-script-files.title"></a>

**`change_ec2_instance_type.sh`**  
기본 스크립트 파일에는 다음 작업을 수행하는 `change_ec2_instance_type()` 함수가 포함되어 있습니다.  
+ 지정된 Amazon EC2 인스턴스가 있는지 확인합니다.
+ `-f`를 선택하지 않으면 인스턴스를 중지하기 전에 사용자에게 경고합니다.
+ 인스턴스 유형을 변경합니다.
+ `-r`을 설정하면 인스턴스를 다시 시작하고 인스턴스가 실행 중인지 확인합니다.
*GitHub*에서 `[change\$1ec2\$1instance\$1type.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/change_ec2_instance_type.sh)`에 대한 코드를 확인하세요.

**`test_change_ec2_instance_type.sh`**  
파일 `test_change_ec2_instance_type.sh` 스크립트는 `change_ec2_instance_type` 함수에 대한 다양한 코드 경로를 테스트합니다. 테스트 스크립트의 모든 단계가 올바르게 작동하는 경우 테스트 스크립트는 생성한 모든 리소스를 제거합니다.  
다음 파라미터와 함께 테스트 스크립트를 실행할 수 있습니다.  
+ **-v** - *(스위치)* 각 테스트는 실행 시 통과/실패 상태를 표시합니다. 기본적으로 테스트는 자동으로 실행되며 출력에는 최종 전체 통과/실패 상태만 포함됩니다.
+ **-i** - *(스위치)* 각 테스트 후에 스크립트가 일시 중지되어 각 단계의 중간 결과를 찾아볼 수 있습니다. Amazon EC2 콘솔을 사용하여 인스턴스의 현재 상태를 검사할 수 있습니다. 프롬프트에서 *Enter* 키를 누르면 스크립트가 다음 단계로 진행됩니다.
*GitHub*에서 `[test\$1change\$1ec2\$1instance\$1type.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/test_change_ec2_instance_type.sh)`에 대한 코드를 확인하세요.

**`awsdocs_general.sh`**  
스크립트 파일 `awsdocs_general.sh`에는 AWS CLI에 대한 고급 예제에서 사용되는 범용 함수가 들어 있습니다.  
*GitHub*에서 `[awsdocs\$1general.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/awsdocs_general.sh)`에 대한 코드를 확인하세요.

## 참조
<a name="cli-services-ec2-instance-type-script-references"></a>

**AWS CLI 참조:** 
+ `[aws ec2](https://docs.aws.amazon.com/cli/v1/reference/ec2/index.html)`
+ `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/describe-instances.html)`
+ `[aws ec2 modify-instance-attribute](https://docs.aws.amazon.com/cli/v1/reference/ec2/modify-instance-attribute.html)`
+ `[aws ec2 start-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/start-instances.html)`
+ `[aws ec2 stop-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/stop-instances.html)`
+ `[aws ec2 wait instance-running](https://docs.aws.amazon.com/cli/v1/reference/ec2/wait/instance-running.html)`
+ `[aws ec2 wait instance-stopped](https://docs.aws.amazon.com/cli/v1/reference/ec2/wait/instance-stopped.html)`

**기타 참조:**
+ [Amazon Elastic Compute Cloud 설명서](https://docs.aws.amazon.com/ec2/)
+ AWS SDK 및 AWS CLI 코드 예제를 보고 기여하려면 *GitHub*에서 [AWS 코드 예제 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/)를 참조하세요.