Alpine Linux 是一格極輕量化的 Linux 作業系統,大多用於 Docker 容器等地方,其實他也可以在 VM 中執行的,省資源而且還是滾動式更新(Rolling Update),減少了很多版更的成本,未來要轉移到其他平台也相當方便。
但由於目前 AWS Marketplace 上還沒看到 Alpine Linux 可供安裝,但其實自己匯入也不難,順便紀錄一下。
前置作業
S3 Bucket: 儲存 VM 檔案
你需要先建立一個 S3 Bucket,VM Import 只能從 S3 中把 VM 的映像檔匯入 EC2。※注意,只能從相同區域的 S3 匯入到同區域的 EC2。
IAM Role: 允許 VM Import 服務代你執行後續操作
新增一個 IAM Role ,目的是 允許 VM Import 這個服務可以用你的身分來幫你做事情,先建立一個 trust-policy.json
檔案,內容如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "vmie.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals":{
"sts:Externalid": "vmimport"
}
}
}
]
}
建立 IAM Role vmimport
:
aws iam create-role --role-name vmimport --assume-role-policy-document "file://trust-policy.json"
再來設定這個 IAM Role vmimport
可以存取什麼資源,如果你想設定細一點的規則,可以參考 AWS 的說明文件,下述範例 role-policy.json
是允許這個 Role 可以讀取所有的 S3 Bucket,並且可以針對 EC2 快照、AMI 進行相關的操作:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:GetObject"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:RegisterImage",
"ec2:Describe*"
],
"Resource": "*"
}
]
}
把規則設定到 IAM Role 中:
aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json
上傳 Alpine Linux 映像到 S3
首先需要先到 Alpine Linux 的 Cloud Image 網站下載已經先包好的 VM 映像檔,請選擇 x86_64 • bios • cloudinit 下的 AWS 映像,因為 AWS 是透過 Cloud Init 設定網路的,直接匯入裝好的版本可以減少後續的麻煩。
下載好以後,想辦法把檔案上傳到 S3 Bucket 中,如果習慣用 AWS CLI 可以直接這樣下指令:
aws s3 cp aws_alpine-3.19.1-x86_64-bios-cloudinit-r0.vhd s3://your-s3-bucket/
upload: ./aws_alpine-3.19.1-x86_64-bios-cloudinit-r0.vhd to s3://your-s3-bucket/aws_alpine-3.19.1-x86_64-bios-cloudinit-r0.vhd
開始匯入
在匯入前,還需要寫一個檔案 containers.json
來描述這個 VM 是什麼、以及他所在的 S3 Bucket 路徑:
{
"Description": "Alpine Linux 3.19.1",
"Format": "VHD",
"UserBucket": {
"S3Bucket": "your-bucket",
"S3Key": "aws_alpine-3.19.1-x86_64-bios-cloudinit-r0.vhd"
}
}
正式開始匯入快照(由於 Alpine Linux 不在 EC2 官方支援的系統中,而 VM Import 有個階段會檢查映像是否是支援的作業系統,所以這邊先匯入快照,後續再到 AWS Console 中手動建立 AMI):
aws ec2 import-snapshot --description "Alpine Linux 3.19.1" --disk-containers file://containers.json --region ap-northeast-1
查看執行進度,可以看到正在轉檔中:
aws ec2 describe-import-snapshot-tasks
{
"ImportSnapshotTasks": [
{
"Description": "Alpine Linux 3.19.1",
"ImportTaskId": "import-snap-xxxxxxx",
"SnapshotTaskDetail": {
"Description": "Alpine Linux 3.19.1",
"DiskImageSize": 180401664.0,
"Format": "VHD",
"Progress": "70",
"Status": "active",
"StatusMessage": "converted",
"UserBucket": {
"S3Bucket": "your-bucket",
"S3Key": "aws_alpine-3.19.1-x86_64-bios-cloudinit-r0.vhd"
}
},
"Tags": []
}
]
}
完成後即可在 EC2 快照看到這個快照,從右上角的 Create image from snapshot
來建立可開機的 AMI:
設定可以參考下面的圖片:
Block device mappings - optional
就不用特別動了,你可以看到 Alpine Linux 實在太小了,1 GiB 就可以開機了,後續可以透過 EBS 再進行擴容:
連線
建立 AMI 完成後,後面用這個 AMI 直接啟動一台 EC2 即可,連線時使用者名稱為 alpine
,配合 EC2 設定的金鑰即可登入:
$ ssh xx.xx.xx.xx -l alpine -i .ssh/myKey.pem
Welcome to Alpine!
The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <https://wiki.alpinelinux.org>.
Alpine release notes:
* <https://alpinelinux.org/posts/Alpine-3.19.1-released.html>
NOTE: 'sudo' is not installed by default, please use 'doas' instead.
You may change this message by editing /etc/motd.
ip-172-31-46-36:~$
第一次進來的時候連 sudo
都沒有、什麼都需要自己裝,這就是 Alpine 如此輕量的原因,不過還是有提供一個 doas
指令取代 sudo
,後面就看各位怎麼運用了。