Terraform ile AWS EC2 uygulaması ( Infrastructure as Code nedir? #3 )
Everything as Code : Infrastructure as Code
Merhaba arkadaşlar ,
Infrastructure as Code ( IaC ) yazı serisine devam ediyoruz.
Bu yazı da end2end olarak bir AWS EC2 altyapısını Terraform ile oluşturacağız.Aşağıdaki AWS şemasına sahip altyapıyı oluşturmaya başlayalım.
Yukarıdaki şema da 172.31.0.0/16
CIDR’ına ait ( AWS Default VPC CIDR ) bir Virtual Private Cloud ( VPC ) bulunmaktadır. Bu VPC içerisinde 172.31.1.0/24
CIDR’ı olan bir subnet oluşturulmuş.Bir adet Route Table’a sahip ve bu 0.0.0.0/0
(Her IP için) IP için Internet Gateway’e attach olmuş durumda. Burada instance içerisindeki trafik VPC içerisinden Route Table’a sorulur ve Route Table ilgili IP setine özel bir tanımlama yok ise 0.0.0.0/0
yani bütün istekleri Internet Gateway’e yönlendirir.
Subnet ( 172.31.1.0/24
) içerisinde de bir Elastic Compute Cloud ( EC2 ) instance’ı bulunmaktadır. Bu instance’in AWS tarafından EC2’lara attach olmuş default 8 GB’lık bir Elastic Block Storage ( EBS ) alanı vardır. Instance içerisinde Nginx çalışmaktadır. Bu instance’a SSH ile bağlanabilmemiz için AWS’de host’umuzun public key’ine sahip bir Key Pair oluşturulmuş.
Aşağıdaki bütün kod bloklarında kullanılan
tags
Name
değeri AWS içerisindeki resource’un ismini tanımlar.
— Virtual Private Cloud ( VPC )
// Provider
provider "aws" {
access_key = "XXXXXXXXXXXXXXXXXXXXX"
secret_key = "XXXXXXXXXXXXXXXXXXXXX"
region = "us-east-2"
}// Virtual Private Cloud (VPC)resource "aws_vpc" "default" {
cidr_block = "172.31.0.0/16"
enable_dns_hostnames = true
tags {
Name = "terraform_aws_vpc"
}
}
enable_dns_hostnames
değeri VPC içerisinde DNS hostname atamasını aktif eder. Bu değer default olarak false
‘dur.
— Subnet
// Public Subnetresource "aws_subnet" "public" {
vpc_id = "${aws_vpc.default.id}"
cidr_block = "172.31.1.0/24"
availability_zone = "us-east-2a"
tags{
Name = "public"
}
}
vpc_id
değerinin aws_vpc.default.id
olduğuna dikkat edin. Terraform’un aws_vpc
resource’undaki default
name’ine sahip VPC’nin id değerini alıyoruz. Böylelikle subnet yukarıda oluşturduğumuz VPC’ye bağlanmış oluyor.
cidr_block
değerine verdiğimiz 172.31.1.0/24
ile subnet toplam da 254 host’a denk gelmekte.
availability_zone
değeri us-east-2a (Ohio)
burada altyapının oluşturacağı region’a ait bir availability zone ekliyoruz.
— Security Group
// Security Groupresource "aws_security_group" "public" {
name = "public"
description = "Allow traffic to pass from the public subnet to the internet"
vpc_id = "${aws_vpc.default.id}"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
// for ping
ingress {
from_port = -1
to_port = -1
protocol = "icmp"
cidr_blocks = ["0.0.0.0/0"]
}egress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
// for ping
egress {
from_port = -1
to_port = -1
protocol = "icmp"
cidr_blocks = ["0.0.0.0/0"]
}tags {
Name = "public"
}
}
Burada yine vpc_id
değeri ile Security Group’u oluşturduğumuz VPC’ye bağladığımızı unutmayın.
- Ingress
Ingress ile dışarıdan gelen trafiğin hangi IP’lere göre kısıtlanacağını ve içerideki hangi portlara erişebileceğini belirtiyoruz.
Burada 80
portunu dışarıdan gelen tüm IP’lere ( 0.0.0.0/0
) cevap verebilir şekilde ekliyoruz.
Yazının ilerleyen kısımlarında
0.0.0.0/0
değeri herkese açık olarak isimlendirilecektir.
Dışarıdan SSH yapabilmek için 22
portunu herkese açık hale getiriyoruz. Son olarak da ping yapabilmemiz için icmpfrom -1 to -1
( tüm portlar için ) dışarıdan içeriye erişilebilir hale getiriyoruz.
- Egress
Egress ile içeriden dışarıya erişebileceğimiz IP’leri kısıtlıyoruz. 80,443
portları ile dışarıdaki her IP’ye erişebilir hale getiriyoruz. Son olarak da ping yapabilmemiz için icmpfrom -1 to -1
( tüm portlar için ) içeriden dışarıya erişilebilir hale getiriyoruz.
— Key Pair
Oluşturacağımız instance’a SSH ile bağlanabilmemiz için public keyimizi AWS içerisine eklememiz ve bağlandığımız instance’a bu Key Pair ile bağlanacağımızı belirtmemiz gerekiyor.
// Key Pairresource "aws_key_pair" "my_key" {
key_name = "my_key"
public_key = "${file("~/.ssh/id_rsa.pub")}"
}
Burada Terraform’un file fonksiyonu ile yolunu belirttiğimiz herhangi bir dosyaya erişebiliriz. Public key’imizin yolunu belirtip Key Pair işlemini de tamamlıyoruz.
— AMI
Instance çalıştırabilmemiz için bir işletim sistemi imajına ihtiyacımız var. AWS içerisinde bu imajlar Amazon Machine Images ( AMI ) olarak isimlendirilmektedir. Bu örnekte Ubuntu 16.04 amd64 hvm-ssd özelliklerinde bir imaj kullanacağız.
Ubuntu’nun official olarak AWS içerisinde EC2 AMI’ları listelediği bir site var.
Biz bu listeden altyapıyı oluşturacağımız region’a ait AMI idsini alıp çok hızlı bir şekilde ilerleyebiliriz. Ama bunu daha profesyonel yapmak için Terraform’un Data Source özelliğini kullanacağız.
ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20180806
Yukarıdaki kullanacağımız imajın adıdır. Biz her region için AMI id değişikliği ile uğraşmak yerine Terraform’a : Bu imaj adına sahip olan imajı istiyorum.
diyeceğiz. Bir Inversion of Control (IoC) örneği.
// Get Ubuntu AMI from Marketplacedata "aws_ami" "ubuntu" {
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20180806"]
}
}
artık ${data.aws_ami.ubuntu.id}
çağırdığımızda bu id’ye erişip gerekli yerlerde kullanacağız ve id değerinin farklı olması bizi ilgilendirmeyecek.
— Internet Gateway
// Internet Gatewayresource "aws_internet_gateway" "default" {
vpc_id = "${aws_vpc.default.id}"
}
AWS’nin her region için bir default VPC oluşturduğunu biliyoruz, aynı şekilde bu VPC’ye attached edilmiş bir Internet Gateway’de oluşturur.
Biz bu kod ile yeni bir Internet Gateway oluşturmuyoruz, AWS’nin oluşturduğunu kullanıyoruz.
— Route Table
// Public Route Table
resource "aws_route_table" "public" {
vpc_id = "${aws_vpc.default.id}"route {
cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.default.id}"
}tags {
Name = "public"
}
}
Burada VPC içerisinden çıkacak olan0.0.0.0/0
trafiğinin yani bütün trafiğin Internet’e çıkmasını sağlayacağız. Instance içerisinden bir istek gelecek VPC bunu Route Table’daki değerlere bakıp ilgili gateway’e yönlendirecek o gateway’de bize Internet erişimini sağlamış olacak.
aws_internet_gateway.default.id
değeri ile yukarıda eklediğimiz resource’u Route Table’a bağlıyoruz.
— Route Table Association
Burada yapılan routing işlemlerini subnet bazlı yapabilmemizi sağlayan bir yapı bulunmakta. Biz şu anda bu tablonun oluşturduğumuz subnet’e spesifik olmasını istiyoruz.Bunun için bu oluşturduğumuz subnet ile route table’ı birbirine bağladığımız kısım Route Table Association’dır.
// Public Route Table Asscociationresource "aws_route_table_association" "public" {
subnet_id = "${aws_subnet.public.id}"
route_table_id = "${aws_route_table.public.id}"
}
— Instance
Şimdi geldik ana amacımıza, artık basit olarak bir instance için gerekli tüm altyapıyı kodladık. Şimdi bu altyapıyla ilişkili bir instance tanımlayalım.
// Instanceresource "aws_instance" "web" {
ami = "${data.aws_ami.ubuntu.id}"
availability_zone = “us-east-2a"
instance_type = “t2.micro"
key_name = "${aws_key_pair.my_key.key_name}"
vpc_security_group_ids = ["${aws_security_group.public.id}"]
subnet_id = "${aws_subnet.public.id}"
associate_public_ip_address = truetags {
Name = “web"
}connection {
user = “ubuntu"
private_key = "${file("~/.ssh/id_rsa")}"
agent = false
host = "${aws_instance.web.public_ip}"
}provisioner "remote-exec" {
inline = [
"sudo apt-get update -y -qq && sudo apt-get install nginx -y -qq"
]
}
}
Yukarıdaki kod bloğunda oluşturduğumuz resource ve datasource’ları instance’a bağlıyoruz.(AMI, Key Pair, Security Group ve Subnet)
instance_type
t2.micro
1 Core CPU ve 1 GB Memory özelliklerine sahip.
associate_public_ip_address
ile instance’e erişebilmek için Public Ip atamasının yapılmasını aktifleştiriyoruz.
Kod bloğunda bulunan connection
kısmında ki bilgiler SSH yapılabilmesi için gerekli olan bilgilerdir. Instance oluşturulduktan sonra bu kısım çalışmaya başlar ve SSH bağlantısını gerçekleştirdikten sonra provisioner
kısmındaki scriptleri instance içerisinde execute eder.
sudo apt-get update -y -qq && sudo apt-get install nginx -y -qq
bu script ise Nginx’in apt paketini instance’a kurar.
Şimdi bu yaptıklarımızı apply etme zamanı.
terraform apply
dediğimizde aşağıdakine benzer bir çıktı elde ederiz.
data.aws_ami.ubuntu: Refreshing state...An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ createTerraform will perform the following actions:+ aws_instance.web
id: <computed>
ami: "ami-529fb82a"
arn: <computed>
associate_public_ip_address: "true"
availability_zone: "us-east-2a"
cpu_core_count: <computed>
cpu_threads_per_core: <computed>
ebs_block_device.#: <computed>
ephemeral_block_device.#: <computed>
get_password_data: "false"
instance_state: <computed>
instance_type: "t2.micro"
ipv6_address_count: <computed>
ipv6_addresses.#: <computed>
key_name: "my_key"
network_interface.#: <computed>
network_interface_id: <computed>
password_data: <computed>
placement_group: <computed>
primary_network_interface_id: <computed>
private_dns: <computed>
private_ip: <computed>
public_dns: <computed>
public_ip: <computed>
root_block_device.#: <computed>
security_groups.#: <computed>
source_dest_check: "true"
subnet_id: "${aws_subnet.public.id}"
tags.%: "1"
tags.Name: "dev_instance"
tenancy: <computed>
volume_tags.%: <computed>
vpc_security_group_ids.#: <computed>+ aws_internet_gateway.default
id: <computed>
vpc_id: "${aws_vpc.default.id}"+ aws_key_pair.my_key
id: <computed>
fingerprint: <computed>
key_name: "my_key"
public_key: "ssh-rsa xxxx alican.kustemur@gmail.com"+ aws_route_table.public
id: <computed>
propagating_vgws.#: <computed>
route.#: "1"
route.~244149437.cidr_block: "0.0.0.0/0"
route.~244149437.egress_only_gateway_id: ""
route.~244149437.gateway_id: "${aws_internet_gateway.default.id}"
route.~244149437.instance_id: ""
route.~244149437.ipv6_cidr_block: ""
route.~244149437.nat_gateway_id: ""
route.~244149437.network_interface_id: ""
route.~244149437.vpc_peering_connection_id: ""
tags.%: "1"
tags.Name: "public"
vpc_id: "${aws_vpc.default.id}"+ aws_route_table_association.public
id: <computed>
route_table_id: "${aws_route_table.public.id}"
subnet_id: "${aws_subnet.public.id}"+ aws_security_group.public
id: <computed>
arn: <computed>
description: "Allow traffic to pass from the public subnet to the internet"
egress.#: "3"
egress.1799340084.cidr_blocks.#: "1"
egress.1799340084.cidr_blocks.0: "0.0.0.0/0"
egress.1799340084.description: ""
egress.1799340084.from_port: "-1"
egress.1799340084.ipv6_cidr_blocks.#: "0"
egress.1799340084.prefix_list_ids.#: "0"
egress.1799340084.protocol: "icmp"
egress.1799340084.security_groups.#: "0"
egress.1799340084.self: "false"
egress.1799340084.to_port: "-1"
egress.2214680975.cidr_blocks.#: "1"
egress.2214680975.cidr_blocks.0: "0.0.0.0/0"
egress.2214680975.description: ""
egress.2214680975.from_port: "80"
egress.2214680975.ipv6_cidr_blocks.#: "0"
egress.2214680975.prefix_list_ids.#: "0"
egress.2214680975.protocol: "tcp"
egress.2214680975.security_groups.#: "0"
egress.2214680975.self: "false"
egress.2214680975.to_port: "80"
egress.2617001939.cidr_blocks.#: "1"
egress.2617001939.cidr_blocks.0: "0.0.0.0/0"
egress.2617001939.description: ""
egress.2617001939.from_port: "443"
egress.2617001939.ipv6_cidr_blocks.#: "0"
egress.2617001939.prefix_list_ids.#: "0"
egress.2617001939.protocol: "tcp"
egress.2617001939.security_groups.#: "0"
egress.2617001939.self: "false"
egress.2617001939.to_port: "443"
ingress.#: "3"
ingress.1799340084.cidr_blocks.#: "1"
ingress.1799340084.cidr_blocks.0: "0.0.0.0/0"
ingress.1799340084.description: ""
ingress.1799340084.from_port: "-1"
ingress.1799340084.ipv6_cidr_blocks.#: "0"
ingress.1799340084.protocol: "icmp"
ingress.1799340084.security_groups.#: "0"
ingress.1799340084.self: "false"
ingress.1799340084.to_port: "-1"
ingress.2214680975.cidr_blocks.#: "1"
ingress.2214680975.cidr_blocks.0: "0.0.0.0/0"
ingress.2214680975.description: ""
ingress.2214680975.from_port: "80"
ingress.2214680975.ipv6_cidr_blocks.#: "0"
ingress.2214680975.protocol: "tcp"
ingress.2214680975.security_groups.#: "0"
ingress.2214680975.self: "false"
ingress.2214680975.to_port: "80"
ingress.2541437006.cidr_blocks.#: "1"
ingress.2541437006.cidr_blocks.0: "0.0.0.0/0"
ingress.2541437006.description: ""
ingress.2541437006.from_port: "22"
ingress.2541437006.ipv6_cidr_blocks.#: "0"
ingress.2541437006.protocol: "tcp"
ingress.2541437006.security_groups.#: "0"
ingress.2541437006.self: "false"
ingress.2541437006.to_port: "22"
name: "public"
owner_id: <computed>
revoke_rules_on_delete: "false"
tags.%: "1"
tags.Name: "public"
vpc_id: "${aws_vpc.default.id}"+ aws_subnet.public
id: <computed>
assign_ipv6_address_on_creation: "false"
availability_zone: "us-east-2a"
cidr_block: "172.31.1.0/24"
ipv6_cidr_block: <computed>
ipv6_cidr_block_association_id: <computed>
map_public_ip_on_launch: "false"
tags.%: "1"
tags.Name: "public"
vpc_id: "${aws_vpc.default.id}"+ aws_vpc.default
id: <computed>
arn: <computed>
assign_generated_ipv6_cidr_block: "false"
cidr_block: "172.31.0.0/16"
default_network_acl_id: <computed>
default_route_table_id: <computed>
default_security_group_id: <computed>
dhcp_options_id: <computed>
enable_classiclink: <computed>
enable_classiclink_dns_support: <computed>
enable_dns_hostnames: "true"
enable_dns_support: "true"
instance_tenancy: "default"
ipv6_association_id: <computed>
ipv6_cidr_block: <computed>
main_route_table_id: <computed>
tags.%: "1"
tags.Name: "terraform_aws_vpc"Plan: 8 to add, 0 to change, 0 to destroy.Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.Enter a value:
yes
dedikten sonra,
SSH ile instance’a bağlanalım.
> ssh -i ~/.ssh/id_rsa ubuntu@54.70.17.236Warning: Permanently added '54.70.17.236' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1063-aws x86_64)* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantageGet cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud11 packages can be updated.
9 updates are security updates.New release '18.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.Last login: Wed Aug 15 13:44:39 2018 from 217.0.0.0
ubuntu@ip-172-31-1-27:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-08-15 13:44:19 UTC; 1min 11s ago
Main PID: 2839 (nginx)
CGroup: /system.slice/nginx.service
├─2839 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
└─2840 nginx: worker processAug 15 13:44:19 ip-172-31-1-27 systemd[1]: Starting A high performance web server and a reverse proxy server...
Aug 15 13:44:19 ip-172-31-1-27 systemd[1]: Started A high performance web server and a reverse proxy server.
Google’a ping atalım.
ubuntu@ip-172-31-1-27:~$ ping google.com
PING google.com (216.58.195.78) 56(84) bytes of data.
64 bytes from sfo07s16-in-f78.1e100.net (216.58.195.78): icmp_seq=1 ttl=44 time=24.7 ms
64 bytes from sfo07s16-in-f78.1e100.net (216.58.195.78): icmp_seq=2 ttl=44 time=24.8 ms
64 bytes from sfo07s16-in-f78.1e100.net (216.58.195.78): icmp_seq=3 ttl=44 time=24.9 ms
64 bytes from sfo07s16-in-f78.1e100.net (216.58.195.78): icmp_seq=4 ttl=44 time=24.7 ms
Dış dünyadan instance’a ping atalım.
> ping 54.70.17.236
PING 54.70.17.236 (54.70.17.236): 56 data bytes
64 bytes from 54.70.17.236: icmp_seq=0 ttl=41 time=232.687 ms
64 bytes from 54.70.17.236: icmp_seq=1 ttl=41 time=253.175 ms
64 bytes from 54.70.17.236: icmp_seq=2 ttl=41 time=276.434 ms
64 bytes from 54.70.17.236: icmp_seq=3 ttl=41 time=312.580 ms
^C
--- 54.70.17.236 ping statistics ---
5 packets transmitted, 4 packets received, 20.0% packet loss
round-trip min/avg/max/stddev = 232.687/268.719/312.580/29.678 ms
Dış dünyadan instance’a port erişim testi yapalım.
— Ingress
- 80
nc -vz 54.70.17.236 80
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif en0
src 192.168.1.24 port 55102
dst 54.70.17.236 port 80
rank info not available
TCP aux info availableConnection to 54.70.17.236 port 80 [tcp/http] succeeded!
- 22
nc -vz 54.70.17.236 22 found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif en0
src 192.168.1.24 port 55144
dst 54.70.17.236 port 22
rank info not available
TCP aux info availableConnection to 54.70.17.236 port 22 [tcp/ssh] succeeded!
- 443
nc -vz 54.70.17.236 443 nc: connectx to 54.70.17.236 port 443 (tcp) failed: Operation timed out
Security Group Ingress değerlerini sadece 80,22 portları için açmıştık, burada instance’in 443 portuna bağlanamadığımızı görüyoruz.
— Egress
ubuntu@ip-172-31-1-27:~$ nc -vz google.com 443
Connection to google.com 443 port [tcp/https] succeeded!ubuntu@ip-172-31-1-27:~$ nc -v google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
Burada da sadece 80,443 portlarına izin verdiğimiz için herhangi bir IP üzerindeki açık olan bu portlara bağlanabildiğimizi görüyoruz.
Son olarak Welcome Nginx sayfası ile şemadaki altyapıyı Terraform ile AWS üzerinde oluşturmuş olduk.
AWS Console’una gidip EC2’nun public ipsine gittiğimizde ise karşımıza Welcome Nginx sayfası gelmektedir.
Şemada ki altyapı örneğini tamamladık. Oluşturduğumuz altyapıyı AWS üzerinden terraform destroy
komutu ile tamamen kaldırabiliriz.
terraform destroyaws_key_pair.my_key: Refreshing state... (ID: my_key)
aws_vpc.default: Refreshing state... (ID: vpc-02d158f0aea35e85f)
data.aws_ami.ubuntu: Refreshing state...
aws_security_group.public: Refreshing state... (ID: sg-0dae8daafb9f0325a)
aws_internet_gateway.default: Refreshing state... (ID: igw-039958a76a18ecbc2)
aws_subnet.public: Refreshing state... (ID: subnet-0711215709de78a27)
aws_route_table.public: Refreshing state... (ID: rtb-0b84f943d998c2fd0)
aws_instance.web: Refreshing state... (ID: i-0f9feb60f7ba4a5e3)
aws_route_table_association.public: Refreshing state... (ID: rtbassoc-004efdaeea888774f)An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroyTerraform will perform the following actions:- aws_instance.web- aws_internet_gateway.default- aws_key_pair.my_key- aws_route_table.public- aws_route_table_association.public- aws_security_group.public- aws_subnet.public- aws_vpc.defaultPlan: 0 to add, 0 to change, 8 to destroy.Do you really want to destroy?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.Enter a value: yesaws_route_table_association.public: Destroying... (ID: rtbassoc-004efdaeea888774f)
aws_instance.web: Destroying... (ID: i-0f9feb60f7ba4a5e3)
aws_route_table_association.public: Destruction complete after 2s
aws_route_table.public: Destroying... (ID: rtb-0b84f943d998c2fd0)
aws_route_table.public: Destruction complete after 3s
aws_internet_gateway.default: Destroying... (ID: igw-039958a76a18ecbc2)
aws_instance.web: Still destroying... (ID: i-0f9feb60f7ba4a5e3, 10s elapsed)
aws_internet_gateway.default: Still destroying... (ID: igw-039958a76a18ecbc2, 10s elapsed)
aws_instance.web: Still destroying... (ID: i-0f9feb60f7ba4a5e3, 20s elapsed)
aws_internet_gateway.default: Still destroying... (ID: igw-039958a76a18ecbc2, 20s elapsed)
aws_instance.web: Still destroying... (ID: i-0f9feb60f7ba4a5e3, 30s elapsed)
aws_internet_gateway.default: Still destroying... (ID: igw-039958a76a18ecbc2, 30s elapsed)
aws_instance.web: Still destroying... (ID: i-0f9feb60f7ba4a5e3, 40s elapsed)
aws_internet_gateway.default: Still destroying... (ID: igw-039958a76a18ecbc2, 40s elapsed)
aws_instance.web: Still destroying... (ID: i-0f9feb60f7ba4a5e3, 50s elapsed)
aws_internet_gateway.default: Still destroying... (ID: igw-039958a76a18ecbc2, 50s elapsed)
aws_internet_gateway.default: Destruction complete after 53s
aws_instance.web: Destruction complete after 59s
aws_security_group.public: Destroying... (ID: sg-0dae8daafb9f0325a)
aws_subnet.public: Destroying... (ID: subnet-0711215709de78a27)
aws_key_pair.my_key: Destroying... (ID: my_key)
aws_key_pair.my_key: Destruction complete after 1s
aws_subnet.public: Destruction complete after 1s
aws_security_group.public: Destruction complete after 2s
aws_vpc.default: Destroying... (ID: vpc-02d158f0aea35e85f)
aws_vpc.default: Destruction complete after 1sDestroy complete! Resources: 8 destroyed.
Terraform’un -
ile işaretlediği resourcelar destroy edilecek anlamına gelir ve biz 8 resource oluşturmuştuk, tamamını sistemden kaldırdı.
Bu örneğe GitHub hesabımdaki repo üzerinden erişebilirsiniz.