

# CloudFormation을 사용하여 Amazon EC2 인스턴스 구성
<a name="quickref-ec2-instance-config"></a>

다음 코드 조각은 CloudFormation을 사용하여 Amazon EC2 인스턴스를 구성하는 방법을 보여줍니다.

**Topics**
+ [일반적인 Amazon EC2 구성](#quickref-ec2-instance-config-general)
+ [인스턴스의 블록 디바이스 매핑 지정](#scenario-ec2-bdm)

## 일반적인 Amazon EC2 구성
<a name="quickref-ec2-instance-config-general"></a>

다음 코드 조각은 CloudFormation을 사용하는 Amazon EC2 인스턴스의 일반적인 구성을 보여줍니다.

**Topics**
+ [지정된 가용 영역에서 Amazon EC2 인스턴스 생성](#scenario-ec2-instance)
+ [EBS 볼륨 및 사용자 데이터를 사용하여 태그가 지정된 Amazon EC2 인스턴스 구성](#scenario-ec2-instance-with-vol-and-tags)
+ [Amazon EC2 인스턴스 시작을 위한 사용자 데이터에 DynamoDB 테이블 이름 정의](#scenario-ec2-with-sdb-domain)
+ [`DeletionPolicy`을(를) 사용하여 Amazon EBS 볼륨 생성](#scenario-ec2-volume)

### 지정된 가용 영역에서 Amazon EC2 인스턴스 생성
<a name="scenario-ec2-instance"></a>

다음 코드 조각은 [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 리소스를 사용하여 지정된 가용 영역에서 Amazon EC2 인스턴스를 생성합니다. 가용 영역의 코드는 리전 코드와 문자 식별자를 조합한 것입니다. 단일 가용 영역에서 인스턴스를 시작할 수 있습니다.

#### JSON
<a name="quickref-ec2-example-6.json"></a>

```
1. "Ec2Instance": {
2.     "Type": "AWS::EC2::Instance",
3.     "Properties": {
4.         "AvailabilityZone": "aa-example-1a",
5.         "ImageId": "ami-1234567890abcdef0"
6.     }
7. }
```

#### YAML
<a name="quickref-ec2-example-6.yaml"></a>

```
1. Ec2Instance:
2.   Type: AWS::EC2::Instance
3.   Properties:
4.     AvailabilityZone: aa-example-1a
5.     ImageId: ami-1234567890abcdef0
```

### EBS 볼륨 및 사용자 데이터를 사용하여 태그가 지정된 Amazon EC2 인스턴스 구성
<a name="scenario-ec2-instance-with-vol-and-tags"></a>

다음 코드 조각은 태그, EBS 볼륨 및 사용자 데이터를 사용하여 Amazon EC2 인스턴스를 생성합니다. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 리소스를 사용합니다. 동일한 템플릿에서 [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) 리소스, [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) 리소스 및 [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) 리소스를 정의해야 합니다. `KeyName`은(는) 템플릿의 `Parameters` 섹션에서 정의해야 합니다.

태그를 사용하면 용도, 소유자 또는 환경 등 원하는 기준에 따라 AWS 리소스를 분류할 수 있습니다. 사용자 데이터를 사용하면 시작 중에 인스턴스에 사용자 지정 스크립트 또는 데이터를 프로비저닝할 수 있습니다. 이 데이터는 초기화 중에 인스턴스에 대한 작업 자동화, 소프트웨어 구성, 패키지 설치 및 기타 작업을 용이하게 합니다.

리소스 태그 지정에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [Amazon EC2 리소스 태깅](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)을 참조하세요.

사용자 데이터에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [인스턴스 메타데이터를 사용하여 EC2 인스턴스를 관리합니다](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)를 참조하세요.

#### JSON
<a name="quickref-ec2-example-7.json"></a>

```
 1. "Ec2Instance": {
 2.   "Type": "AWS::EC2::Instance",
 3.   "Properties": {
 4.     "KeyName": { "Ref": "KeyName" },
 5.     "SecurityGroups": [ { "Ref": "Ec2SecurityGroup" } ],
 6.     "UserData": {
 7.       "Fn::Base64": {
 8.         "Fn::Join": [ ":", [
 9.             "PORT=80",
10.             "TOPIC=",
11.             { "Ref": "MySNSTopic" }
12.           ]
13.         ]
14.       }
15.     },
16.     "InstanceType": "aa.size",
17.     "AvailabilityZone": "aa-example-1a",
18.     "ImageId": "ami-1234567890abcdef0",
19.     "Volumes": [
20.       {
21.         "VolumeId": { "Ref": "MyVolumeResource" },
22.         "Device": "/dev/sdk"
23.       }
24.     ],
25.     "Tags": [ { "Key": "Name", "Value": "MyTag" } ]
26.   }
27. }
```

#### YAML
<a name="quickref-ec2-example-7.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     KeyName: !Ref KeyName
 5.     SecurityGroups:
 6.       - !Ref Ec2SecurityGroup
 7.     UserData:
 8.       Fn::Base64:
 9.         Fn::Join:
10.           - ":"
11.           - - "PORT=80"
12.             - "TOPIC="
13.             - !Ref MySNSTopic
14.     InstanceType: aa.size
15.     AvailabilityZone: aa-example-1a
16.     ImageId: ami-1234567890abcdef0
17.     Volumes:
18.       - VolumeId: !Ref MyVolumeResource
19.         Device: "/dev/sdk"
20.     Tags:
21.       - Key: Name
22.         Value: MyTag
```

### Amazon EC2 인스턴스 시작을 위한 사용자 데이터에 DynamoDB 테이블 이름 정의
<a name="scenario-ec2-with-sdb-domain"></a>

다음 코드 조각은 Amazon EC2 인스턴스를 생성하고 시작 시 인스턴스에 전달할 DynamoDB 테이블 이름을 사용자 데이터에 정의합니다. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 리소스를 사용합니다. 사용자 데이터에 파라미터 또는 동적 값을 정의하여 시작 시 EC2 인스턴스를 전달할 수 있습니다.

사용자 데이터에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [인스턴스 메타데이터를 사용하여 EC2 인스턴스를 관리합니다](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)를 참조하세요.

#### JSON
<a name="quickref-ec2-example-8.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "UserData": {
 5.             "Fn::Base64": {
 6.                 "Fn::Join": [
 7.                     "",
 8.                     [
 9.                         "TableName=",
10.                         {
11.                             "Ref": "DynamoDBTableName"
12.                         }
13.                     ]
14.                 ]
15.             }
16.         },
17.         "AvailabilityZone": "aa-example-1a",
18.         "ImageId": "ami-1234567890abcdef0"
19.     }
20. }
```

#### YAML
<a name="quickref-ec2-example-8.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     UserData:
 5.       Fn::Base64:
 6.         Fn::Join:
 7.           - ''
 8.           - - 'TableName='
 9.             - Ref: DynamoDBTableName
10.     AvailabilityZone: aa-example-1a
11.     ImageId: ami-1234567890abcdef0
```

### `DeletionPolicy`을(를) 사용하여 Amazon EBS 볼륨 생성
<a name="scenario-ec2-volume"></a>

다음 코드 조각은 Amazon EC2 [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) 리소스를 사용하여 Amazon EBS 볼륨을 생성합니다. `Size` 또는 `SnapshotID` 속성을 사용하여 볼륨을 정의할 수 있지만 둘 다 사용할 수는 없습니다. 스택을 삭제할 때 볼륨의 스냅샷을 생성하도록 `DeletionPolicy` 속성이 설정됩니다.

`DeletionPolicy` 속성에 대한 자세한 내용은 [DeletionPolicy 속성](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)을 참조하세요.

Amazon EBS 볼륨 생성에 대한 자세한 내용은 [Amazon EBS 볼륨 생성](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html)을 참조하세요.

#### JSON
<a name="quickref-ec2-example-13.json"></a>

이 코드 조각은 지정된 **크기**로 Amazon EBS 볼륨을 생성합니다. 크기는 10으로 설정되어 있지만 필요에 따라 조정할 수 있습니다. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) 리소스를 사용하면 크기 또는 스냅샷 ID를 지정할 수 있지만 둘 다 지정할 수는 없습니다.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "Size": "10",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

이 코드 조각은 제공된 **스냅샷 ID**를 사용하여 Amazon EBS 볼륨을 생성합니다. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) 리소스를 사용하면 크기 또는 스냅샷 ID를 지정할 수 있지만 둘 다 지정할 수는 없습니다.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "SnapshotId" : "snap-1234567890abcdef0",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

#### YAML
<a name="quickref-ec2-example-13.yaml"></a>

이 코드 조각은 지정된 **크기**로 Amazon EBS 볼륨을 생성합니다. 크기는 10으로 설정되어 있지만 필요에 따라 조정할 수 있습니다. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) 리소스를 사용하면 크기 또는 스냅샷 ID를 지정할 수 있지만 둘 다 지정할 수는 없습니다.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     Size: 10
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

이 코드 조각은 제공된 **스냅샷 ID**를 사용하여 Amazon EBS 볼륨을 생성합니다. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) 리소스를 사용하면 크기 또는 스냅샷 ID를 지정할 수 있지만 둘 다 지정할 수는 없습니다.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     SnapshotId: snap-1234567890abcdef0
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

## 인스턴스의 블록 디바이스 매핑 지정
<a name="scenario-ec2-bdm"></a>

블록 디바이스 매핑은 인스턴스에 연결할 블록 디바이스(인스턴스 스토어 볼륨 및 EBS 볼륨 포함)를 정의합니다. AMI를 생성할 때 블록 디바이스 매핑을 지정하면 AMI에서 실행되는 모든 인스턴스가 해당 매핑을 사용할 수 있습니다. 또는 인스턴스를 실행할 때 블록 디바이스 매핑을 지정하여 해당 매핑이 인스턴스가 실행된 AMI에서 지정된 매핑을 재정의하도록 할 수 있습니다.

다음 템플릿 코드 조각을 사용하면 [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 리소스의 `BlockDeviceMappings` 속성을 사용하여 EBS 또는 인스턴스 스토어 볼륨의 블록 디바이스 매핑을 지정할 수 있습니다.

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

**Topics**
+ [두 EBS 볼륨의 블록 디바이스 매핑 지정](#w2aac11c41c43c13b9c11)
+ [인스턴스 스토어 볼륨의 인스턴스 블록 디바이스 매핑 지정](#w2aac11c41c43c13b9c13)

### 두 EBS 볼륨의 블록 디바이스 매핑 지정
<a name="w2aac11c41c43c13b9c11"></a>

#### JSON
<a name="quickref-ec2-example-1.json"></a>

```
"Ec2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
      "KeyName": { "Ref": "KeyName" },
      "InstanceType": { "Ref": "InstanceType" },
      "SecurityGroups": [{ "Ref": "Ec2SecurityGroup" }],
      "BlockDeviceMappings": [
        {
          "DeviceName": "/dev/sda1",
          "Ebs": { "VolumeSize": "50" }
        },
        {
          "DeviceName": "/dev/sdm",
          "Ebs": { "VolumeSize": "100" }
        }
      ]
    }
  }
}
```

#### YAML
<a name="quickref-ec2-example-1.yaml"></a>

```
EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      KeyName: !Ref KeyName
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref Ec2SecurityGroup
      BlockDeviceMappings:
        -
          DeviceName: /dev/sda1
          Ebs:
            VolumeSize: 50
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeSize: 100
```

### 인스턴스 스토어 볼륨의 인스턴스 블록 디바이스 매핑 지정
<a name="w2aac11c41c43c13b9c13"></a>

#### JSON
<a name="quickref-ec2-example-2.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance", 
  "Properties" : {
    "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
    "KeyName" : { "Ref" : "KeyName" },
    "InstanceType": { "Ref": "InstanceType" },
    "SecurityGroups" : [{ "Ref" : "Ec2SecurityGroup" }],
    "BlockDeviceMappings" : [
      {
        "DeviceName"  : "/dev/sdc",
        "VirtualName" : "ephemeral0"
      }
    ]
  }
}
```

#### YAML
<a name="quickref-ec2-example-2.yaml"></a>

```
EC2Instance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    KeyName: !Ref KeyName
    InstanceType: !Ref InstanceType
    SecurityGroups:
      - !Ref Ec2SecurityGroup
    BlockDeviceMappings:
      - DeviceName: /dev/sdc
        VirtualName: ephemeral0
```