AmazonLinux2023をWSL2上で動かす

2023/03/18に公開

Docker コンテナから WSL の環境が作成出来ること(公式ドキュメント例では CentOS を Docker から作っている)を利用して、
amazonlinux2023 公式イメージからそれっぽいものを作る

0. 動機・目的

8 割方「なんとなくやってみたかったので」に尽きる。

あと、真面目な動機としては

  • ローカル環境で EC2 を模擬できることは(特定の環境の人間にとって)意義深い
    • 全員が全員「サンドボックスアカウントみたいな実験用の AWS 環境があって、新しいサービスや機能がリリースされれば実環境でサクッと試せる」
      みたいな環境にいる訳ではなく、職場によってちょっとしたことを実験するのにも色々手続きや制約があったりなかったり、、、
    • そういう人にとってはリスクや制約の少ないローカル環境で練習できると安心しやすい
  • 最近だと WSL は初心者+α くらいのレベルの人にまで結構浸透している感覚があって、
    VirtualBox とかよりもむしろ人に情報展開するハードルが低そうな気がした

みたいな感じで、
どちらかというと組織内で AmazonLinux2023 への移行を早める・安全にする手段の選択肢にならないか、
という仮説検証のためだったりもする。

1. 実行手順

1-0. 検証環境について

  • Windows11
  • WSL2 Ubuntu22.04LTS (docker イメージ・コンテナの作成などに使用)
  • WSL バージョン: 1.1.3.0

1-1. Docker イメージの作成

Docker Official Image としてAmazonLinuxが公開されており、既に AmazonLinux2023 も使える。

ただし、Docker で使う用なので普通に EC2 を立てたときに比べるとパッケージがかなり削ぎ落とされていたり、設定が違う部分がある。
全部を EC2 の場合と同じにするのは大変だが、用途・目的に合わせて必要な分は合わせる形にする。
なお、EC2 の AmazonLinux2023 の設定についてはありがたいことに DevelopersIO のAmazon Linux 2023 が GA されましたにかなり詳しく掲載されていたので、大幅に参考にした。

とりあえず今回は

  1. 必要そうなパッケージの追加
  2. ユーザー(おなじみ ec2-user)をそれっぽく作成
  3. その他設定の変更

といった感じでカスタマイズする

Dockerfile を以下のような感じで用意しておく。

Dockerfile
FROM amazonlinux:2023

# WSL用の設定ファイルを追加する
COPY wsl.conf /etc/wsl.conf

USER root
RUN dnf update -y && \
    # 必要そうなパッケージを追加していく \
    dnf install -y --allowerasing coreutils && \
    dnf install -y nano vim \
    sudo passwd audit acl \
    openssh openssh-clients openssh-server \
    net-tools iproute iputils hostname gnutls bind-utils \
    less which wget findutils rsync tar unzip zip \
    bc gawk binutils \
    bash-completion \
    man-db man-pages \
    python3-pip \
    awscli-2 \
    cloud-init \
    dnf-plugins-core dnf-plugin-support-info dnf-plugin-release-notification \
    && \
    # cache削除 \
    dnf clean all && \
    rm -rf /var/cache/yum && \
    rm -rf /var/cache/dnf

# 自動起動したいサービスがあれば↓のような感じで設定しておく(wsl.confなどでsystemdを有効にする)
# RUN systemctl enable sshd.service

# ec2-user作成
RUN useradd -m -s /bin/bash -u 1000 ec2-user && \
    echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers

USER ec2-user
WORKDIR /home/ec2-user

追加しているパッケージはなんとなくなので、
必要性と目的に応じて適宜調整する。

また、useradd の各オプションは例えば https://linuxjm.osdn.jp/html/shadow/man8/useradd.8.html などを参照のこと。
更に、ec2-user はデフォルトではパスワード無しで sudo を使えるため、そのような設定にするため/etc/sudoersへ追記している。

COPY コマンドで使っているwsl.confは以下の内容を設定

wsl.conf
[interop]
appendWindowsPath = false

[boot]
systemd=true

[user]
default=ec2-user

↑ について、

  • interop.appendWindowsPath: 趣旨的になるべく EC2 っぽいものを再現したいので、Windows の PATH を引き継がない方がそれらしいため設定している。
  • boot.systemd: systemd を有効にするために追加
  • (参考として、Distrodなどを使って systemd を有効にする方法もある)
  • user.default: wsl --importで作成した WSL ディストリビューションはデフォルトユーザーが root になってしまうので、変えたい場合は設定が必要

これでイメージのビルドを行う:

# イメージ名をal2023にする例
docker build -t al2023 .

WSL でイメージのインポートを行うための tar ファイルを作成する。
このために一旦コンテナを起動して export を行う。

# コンテナ起動
docker run --name al2023 al2023:latest

# export
# CドライブやDドライブなど、Windows上から見える適当な場所にtarファイルを書き出す
docker export -o /mnt/d/path/to/Amazonlinux2023-Base.tar al2023 # al2023はコンテナ名。コンテナIDを使ってもOK

# tarファイルのexport完了後は↑で起動したコンテナはいらないので、コンテナ名を指定して削除
docker container rm al2023

最後に、この export した tar ファイルを PowerShell などのwslコマンドで import すれば OK

# wsl --import <作成するDistro名> <作成したDistroのディスクなどの格納パス> <インポートするtarファイルのパス>

# AmazonLinux2023-exampleというdistro名で作成する。
wsl --import AmazonLinux2023-example D:\Path\to\AmazonLinux2023-example D:\Path\to\AmazonLinux2023-Base.tar

export と import のあたりは公式ドキュメントも参照

import が完了すれば WSL2 に無事 AmazonLinux2023 を導入することが出来ており、

# powershellなど
wsl -d AmazonLinux2023-example -u ec2-user # AmazonLinux2023-example は作成したDistro名なので、作成内容に応じて適宜変える

のようにして開始することができる。

その他の参考リンクなど

GitHubで編集を提案

Discussion