在 AWS EC2 上直接執行 Alpine Linux 虛擬機


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,後面就看各位怎麼運用了。


comments powered by Disqus