AWS CLI Custom AMI ve Launch Template

Daha önceki notlarımdan birinde oluşturmuş olduğum Instance hala aktif. Mevcut Instance describe şu şekilde:

$ aws ec2 describe-instances > instances.txt

$ cat instances.txt 
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-05fa00d4c63e32376",
                    "InstanceId": "i-0dbe239d838e2c2af",
                    "InstanceType": "t2.micro",
                    "KeyName": "blogkeypair",
                    "LaunchTime": "2022-08-28T13:46:14+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "us-east-1c",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-172-31-27-116.ec2.internal",
                    "PrivateIpAddress": "172.31.27.116",
                    "ProductCodes": [],
                    "PublicDnsName": "ec2-3-88-13-40.compute-1.amazonaws.com",
                    "PublicIpAddress": "3.88.13.40",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    "StateTransitionReason": "",
                    "SubnetId": "subnet-0e28c937d93c1c2ee",
                    "VpcId": "vpc-0d5f861820a8489a3",
                    "Architecture": "x86_64",
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda",
                            "Ebs": {
                                "AttachTime": "2022-08-28T13:46:14+00:00",
                                "DeleteOnTermination": true,
                                "Status": "attached",
                                "VolumeId": "vol-02a0b6b7369e1060c"
                            }
                        }
                    ],
                    "ClientToken": "ab10647e-1067-466a-bbe1-bab95e3e3019",
                    "EbsOptimized": false,
                    "EnaSupport": true,
                    "Hypervisor": "xen",
                    "NetworkInterfaces": [
                        {
                            "Association": {
                                "IpOwnerId": "amazon",
                                "PublicDnsName": "ec2-3-88-13-40.compute-1.amazonaws.com",
                                "PublicIp": "3.88.13.40"
                            },
                            "Attachment": {
                                "AttachTime": "2022-08-28T13:46:14+00:00",
                                "AttachmentId": "eni-attach-070ab46ffcf4e303f",
                                "DeleteOnTermination": true,
                                "DeviceIndex": 0,
                                "Status": "attached",
                                "NetworkCardIndex": 0
                            },
                            "Description": "",
                            "Groups": [
                                {
                                    "GroupName": "blog-sg",
                                    "GroupId": "sg-02fa260207296790e"
                                }
                            ],
                            "Ipv6Addresses": [],
                            "MacAddress": "0a:ae:8a:7f:27:79",
                            "NetworkInterfaceId": "eni-0cc5f06dd92cce3aa",
                            "OwnerId": "627113922449",
                            "PrivateDnsName": "ip-172-31-27-116.ec2.internal",
                            "PrivateIpAddress": "172.31.27.116",
                            "PrivateIpAddresses": [
                                {
                                    "Association": {
                                        "IpOwnerId": "amazon",
                                        "PublicDnsName": "ec2-3-88-13-40.compute-1.amazonaws.com",
                                        "PublicIp": "3.88.13.40"
                                    },
                                    "Primary": true,
                                    "PrivateDnsName": "ip-172-31-27-116.ec2.internal",
                                    "PrivateIpAddress": "172.31.27.116"
                                }
                            ],
                            "SourceDestCheck": true,
                            "Status": "in-use",
                            "SubnetId": "subnet-0e28c937d93c1c2ee",
                            "VpcId": "vpc-0d5f861820a8489a3",
                            "InterfaceType": "interface"
                        }
                    ],
                    "RootDeviceName": "/dev/xvda",
                    "RootDeviceType": "ebs",
                    "SecurityGroups": [
                        {
                            "GroupName": "blog-sg",
                            "GroupId": "sg-02fa260207296790e"
                        }
                    ],
                    "SourceDestCheck": true,
                    "VirtualizationType": "hvm",
                    "CpuOptions": {
                        "CoreCount": 1,
                        "ThreadsPerCore": 1
                    },
                    "CapacityReservationSpecification": {
                        "CapacityReservationPreference": "open"
                    },
                    "HibernationOptions": {
                        "Configured": false
                    },
                    "MetadataOptions": {
                        "State": "applied",
                        "HttpTokens": "optional",
                        "HttpPutResponseHopLimit": 1,
                        "HttpEndpoint": "enabled",
                        "HttpProtocolIpv6": "disabled",
                        "InstanceMetadataTags": "disabled"
                    },
                    "EnclaveOptions": {
                        "Enabled": false
                    },
                    "PlatformDetails": "Linux/UNIX",
                    "UsageOperation": "RunInstances",
                    "UsageOperationUpdateTime": "2022-08-28T13:46:14+00:00",
                    "PrivateDnsNameOptions": {
                        "HostnameType": "ip-name",
                        "EnableResourceNameDnsARecord": false,
                        "EnableResourceNameDnsAAAARecord": false
                    },
                    "MaintenanceOptions": {
                        "AutoRecovery": "default"
                    }
                }
            ],
            "OwnerId": "627113922449",
            "ReservationId": "r-0b4beef74bbf2bfe6"
        }
    ]
}

Mevcut Instance ile custom AMI oluşturalım. Bu sayede datalarımız koruyarak bu AMI ile hızlı bir şekilde yeniden Instance oluşturabiliriz.

$ aws ec2 create-image \
--instance-id i-0dbe239d838e2c2af \
--name "MyCustomAMI" \ 
--description "TestCustomAMI"
{
    "ImageId": "ami-069224148168b996a"
}

ImageId ile oluşturduğumuz CustomAMI kontrol edelim.

$ aws ec2 describe-images --image-ids ami-069224148168b996a
{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2022-08-28T17:16:02.000Z",
            "ImageId": "ami-069224148168b996a",
            "ImageLocation": "627113922449/MyCustomAMI",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "627113922449",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-0b1bc8bcea991d4c6",
                        "VolumeSize": 8,
                        "VolumeType": "gp2",
                        "Encrypted": false
                    }
                }
            ],
            "Description": "TestCustomAMI",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "MyCustomAMI",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "VirtualizationType": "hvm"
        }
    ]
}

Sorgulama aşamasından da anlaşılacağı üzere Status available durumuna gelmiş bulunuyor fakat bu sureç 10 dakikaya kadar uzayabilir. Buna dikkat edelim. Şu anda CustomAMI oluştuğuna göre bununla daha önceden oluşturmuş olduğum Instance'ın datalarını koruyarak yeniden hızlı bir şekilde Instance oluşturabilirim. CustomAMI oluşturuken farklı bir özellik ise EC2 Image Builder; pipeline ile bir image oluşturabiliyoruz; fakat şimdilik bu konu hakkında herhangi bir notum bulunmuyor. Devam edelim. Custom AMI, Snapshot'a çok benzese de farklı olarak metadatlarını da saklamış oluyoruz. Elimizde bir ImageId bulunmakta. Bu ImageId CustomAMI ait. Aslında bu aşamadan sonra,

$ aws ec2 run-instances --image-id ami-069224148168b996a

komut satırı ile yeni bir instance oluşturabiliriz; fakat bu süreçte yine bazı ek parametreleri girmek zorundayız. Bunun yerine ikinci bir konu Template oluşturmak. Template'i ise tüm özelliklerin korunduğu bir şablon olarak düşünebiliriz ve saniyeler içinde Template ile bir Instance oluşturabiliriz. Launch Template şu komut satırını çalıştırabiliriz.

$ aws ec2 create-launch-template \ 
--launch-template-name FirstTemplate \ 
--version-description FirstTemplate \ 
--launch-template-data '{"ImageId":"ami-069224148168b996a", "InstanceType":"t2.micro", "KeyName":"blogkeypair", "NetworkInterfaces":[{"Groups":["sg-02fa260207296790e"]}], "TagSpecifications":[{"ResourceType":"instance", "Tags":[{"Key":"purpose","Value":"Web00"}]}]}'

{
    "LaunchTemplate": {
        "LaunchTemplateId": "lt-0e14c470a488d3a96",
        "LaunchTemplateName": "FirstTemplate",
        "CreateTime": "2022-08-29T12:52:23+00:00",
        "CreatedBy": "arn:aws:iam::627113922449:user/awscli",
        "DefaultVersionNumber": 1,
        "LatestVersionNumber": 1
    }
}

Artık hızlıca Instance oluşturabileceğimiz bir Launch Template oluşturmuş olduk. O halde bir Instance oluşturalım.

$ aws ec2 run-instances \
--launch-template LaunchTemplateId=lt-0e14c470a488d3a96 \
--tag-specifications 'ResourceType=instance, Tags=[{Key=webserver,Value=web02}]'

{
    "Groups": [],
    "Instances": [
        {
            "AmiLaunchIndex": 0,
            "ImageId": "ami-069224148168b996a",
            "InstanceId": "i-02d4cdfb0cfe4c358",
            "InstanceType": "t2.micro",
            "KeyName": "blogkeypair",
            "LaunchTime": "2022-08-29T13:18:35+00:00",
            "Monitoring": {
                "State": "disabled"
            },
...
...
...

Kontrol edelim.

$ aws ec2 describe-instances > instances.txt

$ cat instances.txt 

{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-069224148168b996a",
                    "InstanceId": "i-02d4cdfb0cfe4c358",
                    "InstanceType": "t2.micro",
                    "KeyName": "blogkeypair",
                    "LaunchTime": "2022-08-29T13:18:35+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "us-east-1b",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-172-31-86-227.ec2.internal",
                    "PrivateIpAddress": "172.31.86.227",
                    "ProductCodes": [],
                    "PublicDnsName": "ec2-3-91-49-233.compute-1.amazonaws.com",
                    "PublicIpAddress": "3.91.49.233",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    ...
                    .............................................................
       {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-05fa00d4c63e32376",
                    "InstanceId": "i-0dbe239d838e2c2af",
                    "InstanceType": "t2.micro",
                    "KeyName": "blogkeypair",
                    "LaunchTime": "2022-08-28T13:46:14+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "us-east-1c",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-172-31-27-116.ec2.internal",
                    "PrivateIpAddress": "172.31.27.116",
                    "ProductCodes": [],
                    "PublicDnsName": "ec2-3-88-13-40.compute-1.amazonaws.com",
                    "PublicIpAddress": "3.88.13.40",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    ...
                    ...

Iki Instance'a sahip olduğumuza göre her Instance'a birer request atalım ve burada bitirelim.

$ curl 3.88.13.40
<h1>Created for CentOS</h1>

$ curl 3.91.49.233
<h1>Created for CentOS</h1>

İkinci Template'den oluşturmuş olduğumuz Instance için herhangi bir işlem yapmamış olmamıza rağmen aynı datayı koruduğunu görüyoruz. AMI ve Launch Template notlarımı bu şekilde bitiriyorum.


İletişime geçmek, yorum bırakmak veya hatalarımı düzetlmek istersen mail atabilirsin.

iletişim için tıklama yeri