〖實作示範〗EC2模板 — EBS-backed AMI 建立與使用

用圖片高效學程式
12 min readAug 1, 2021

--

今天我們要來介紹AMI實作演練,那我們開始吧!

演練步驟介紹

首先會使用一個AWS本身提供的AMI(下圖#1),我們將使用Amazon Linux 64-bit這個作業系統,並且使用EBS當作開機硬碟。

透過AMI(下圖#1),我們將可以去建立一個EC2 Instance(下圖#2),這個Instance將根據AMI,使用Amazon Linux 64-bit的作業系統,並使用EBS當作Root Volume。

我們會將EC2 Instance(下圖#2)去外接一個EBS Volume(下圖#3),我們會在其中安裝需要的套件與檔案。

而EBS Volume(下圖#3)完成之後,會轉換成一個EBS Snapshot(下圖#4)。如下圖:

有了上圖藍底的部分,也就是Amazon Linux 64-bit與EBS Snapshot之後,就可以去建立一個新的AMI(下圖#5),作業系統一樣是Amazon Linux 64-bit,而新的EBS Snapshot便會涵蓋A檔案以及安裝套件。

在未來,我們可以透過這個AMI(下圖#5)去創造許多新的EC2 Instance,這些新的EC2 Instance中(下圖#6),會同樣使用Amazon Linux 64-bit,並且每一個EBS Volume(下圖#7)裡面都會涵蓋之前所安裝的所有東西,這邊特別注意,這個EBS Volume(下圖#7)是從EBS Snapshot(下圖#4)下來的。如下圖:

建立EC2

首先到AWS Management Console搜尋VPC,如下圖:

到了VPC介面之後,點選Launch VPC Wizard,如下圖:

快速建立一個Public Subet,點Select,如下圖:

Step2,給他一個VPC名稱,我叫他vpc-ami-demo,好了之後按Create VPC,如下圖:

完成之後,點選左上角Services,搜尋EC2並在新分頁開啟,如下圖:

進去之後,要來建立新的EC2,點左側列表的Instances,並點Launch Instance,如下圖:

建立七步驟可以參考〖實作示範〗EC2儲存資源 — EBS Volume 建立與使用 part 1中的介紹,在這次的Demo之中,與〖實作示範〗EC2儲存資源 — EBS Volume 建立與使用 part 1不同的部分有:
Step2選擇Instance Type時,這邊選與本地機器最像的,如下圖:

Step3的Network選擇我們剛剛建立的VPC,Subnet給他Public Subnet,Auto-assign IP選擇Enable,如下圖:

Step6這邊要新增一個Rule,按Add Rule,給他80 Port進來的權限,Source選Anywhere,如下圖:

Step7,跳出視窗給他新的key Pair name,我叫他my-ec2-ami-demo,並Download Key Pair,好了之後Launch Instances,如下圖:

View Instances之後,點選左側列表Instances,就能看到新創的EC2啟起來了,呈現running,給他一個名稱,我叫他ec2-first,如下圖:

再來開啟Terminal,cd到剛剛下載Key Pair的目錄(我的在Download),如下圖:

回到EC2介面,按Connect,複製chmod,如下圖:

回到Terminal貼上,再回到剛剛的EC2介面複製SSH指令,再到Terminal貼上。

打上yes,看到Amazon Linux AMI就代表成功連進EC2 Instance裡面,如下圖:

客製化EC2環境

你可能會想要在EC2 Instance裡面放置一些客製化圖片或者檔案,在這邊我就用sudo fallocate -l 1G指令加上fake_file_in_ami來代表這些東西。好了之後打ls -l檢查一下,發現fake file確實在裡面。如下圖:

再來,安裝一些之後要用到的套件,打sudo yum install -y git來安裝git指令(yum是我使用的Linux版本的安裝指令,可以根據使用不同的安裝套件替換掉即可)。如下圖:

好了之後檢查一下,打上sudo git — version,可以看到已經成功安裝。再來我要安裝docker,打上sudo yum install -y docker,如下圖:

好了之後檢查一下,打上sudo docker — version,可以看到已成功安裝,如下圖:

接下來,要透過docker來啟起一台Web Server,打上sudo service docker start,好了之後打上sudo docker run — network host nginx(nginx是一個web server,這邊不做仔細介紹),如下圖:

好了之後看到ready for start up就代表成功啟起一台nginx server。而nginx server使用的是80 Port,剛剛在建立EC2 Instance時在Sercurity Group的設定就有特別開放80 Port,如下圖:

回到EC2介面,複製右下角的Public IP,開啟新分頁貼上IP並配上80 Port,就可以看到成功進入nginx首頁頁面,如下圖:

最後回到Terminal,Control C來結束這個nginx server。
到這邊已經把環境建立好了,如果我未來不想要每次建一台EC2時都要重複上述的動作,就必須要將他打包成一包AMI。

將EC2環境打包成AMI

左側列表點Instance,選擇ec2-first,按Actions,Image中Create Image,這邊的Create Image就是在Create AMI,如下圖:

可以給他一個Image name,我叫他ami-demo-001,No reboot的意思是當AWS在後面建立AMI時,預設會把EC2關掉,這邊建議按照預設就好(不用打勾),好了就按Create Image,如下圖:

點選左側列表AMIs,可以看到AMI呈現Available,成功建立,如下圖:

點選左側列表EBS Snapshots,就會看到一個新的Snapshot,他是隨著AMI一起建立起來的,如下圖:

確認AMI是否能建立EC2

現在先回到Instances,要把原本建立的ec2-first砍掉,點選ec2-first,Actions,Instance State中Terminate。跳出視窗後點Yes Terminate,如下圖:

完成之後,就能看到ec2-first變成terminated,被砍掉了,如下圖:

點左邊列表EBS Volumes,也會看到EBS Volume都跟著不見,如下圖:

到這邊,我們已經砍掉EC2 Instance與EBS Volume了。

再來,要運用AMI來創造一台新的EC2 Instance。
點左側AMIs,選已經創好的AMI,Actions與Launch,如下圖:

Instance Type選擇跟剛剛一樣的,如下圖:

Step3也與剛剛操作一樣,如下圖:

Step4 Add Storage就非常重要了,這邊有一個Snapshot ID,他其實就是剛剛建立AMI的過程中所建造的EBS Snapshot,裡面有我們安裝的套件以及檔案,如下圖:

Step6 Security Group與前面進行一樣的動作,如下圖:

Step7跳出視窗,要選擇建立的my-ecc2-ami-demo,如下圖:

完成剩餘步驟後,EC2就起來了,呈現running的狀態。

可以給他一個命名,我叫他ec2-second,如下圖:

這時可以到EBS Volume中確認,我們從AMI的EBS Snapshot中,建立了一個EBS Volume,如下圖:

回到Instances介面,選擇ec2-second,按Connect,複製SSH指令,不過可以看到SSH指令中有時候會把一部分改成root,這是我們不要的,等等會處理,如下圖:

打開Terminal,貼上SSH指令,將原本root的部分改寫為ec2-user,這是文件規範,如下圖:

打上yes,就連進一台新的,ec2-second這一台EC2 Instance,而且是從客製化AMI裡面創造出來的如下圖:

這邊直接打上sudo git — version,來看看有沒有這個套件已經在裡面,發現確實有。再打上sudo docker — version,發現docker也在裡面,如下圖:

也就是說一啟動這台EC2 Instance時,當我們打上sudo docker run network host nginx,就可以啟起一台nginx Server來使用,如下圖:

一樣回到Instance介面複製右下角Public IP,開啟新分頁貼上IP並配上80 Port,就能成功看到nginx介面,如下圖

回到Terminal,按Control C結束nginx server。按ls -lh看一下,能看到fake file依舊在裡面,如下圖:

總結

這次我們就創造了一個客製化的AMI,包含所有環境需要的套件以及檔案,未來所有EC2都能按照這個模板創造出來,非常方便。

那以上是我們對AMI的演練的介紹。

--

--