Dev Containersで Amazon Linux 2023を使う

Posted on 2024/01/31

ToC

Dev Containersとは…

Dev Containersは、プロジェクトに必要な依存関係やツールをコンテナにインストールした開発環境を構築できるVisual Studio Codeの拡張機能です。 Dev Containersの利用には、Dockerが事前にインストールされている必要があります。 これまで、JetBrainsのエディタを積極的に利用していましたが、Dev Containersを利用してみたかったのでVSCodeを利用してみました。

Dev Containersでは、Dockerコンテナの起動およびローカルOS上に保存されているソースコードをコンテナ上にVolumeマウント、アプリケーションで必要なポートをマッピングする機能が提供されます。コンテナは、Microsoftによって提供される標準のDocker Imageを利用できます。コンテナ起動は、VSCode上でインタラクティブに対象のOSやツール、バージョンを選択して、Python, NodeJSなどの環境が構築できます。

今回は稼働環境のインフラの検証も兼ねてAmazon Linux 2023で環境を構築してみます。

初期環境の構築

はじめにソースコードを配置するために新しいディレクトリを作成します。 そして、VS Codeにて、作成したフォルダを File > Open Folder から開きます。

次にCommand + Shift + P キーでコマンドウインドウを起動して、Dev Containers: New Dev Containerと入力します。 すると、インタラクティブに設定を行うことができます。 詳細の手順については、こちらのページを参考にすると簡単に進めることができます。

Amazon Linux 2023への設定ファイルの書き換え

次は、今回のメインの部分のAmazon Linux 2023用に自分で設定ファイルを準備してみます。 devcontainerの設定ファイルの書き換えと起動するDockerfileの設定ファイルを実施します。

.devcontainer/devcontainer.json

// For format details, see https://aka.ms/devcontainer.json. For config options, see the
{
    "build": {
    "dockerfile": "Dockerfile",
        "args": {
            "VARIANT": "2023",
            "PYTHON_VERSION": "3.11.7"
        }
    },
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-python.black-formatter",
                "ms-python.vscode-pylance",
                "ms-python.python",
                "azemoh.one-monokai",
                "vscode-icons-team.vscode-icons",
                "eamodio.gitlens"
            ]
        }
    },
    "remoteUser": "ec2-user"
}

.devcontainer/Dockerfile

ARG VARIANT="2023"
FROM public.ecr.aws/amazonlinux/amazonlinux:${VARIANT}

RUN dnf update -y \
    && dnf groupinstall -y "Development tools" \
    && dnf install -y shadow-utils \
        tar \
        gzip \
        sudo \
        bash-completion \
        git \
        which \
        python

RUN dnf install -y zip unzip \
    && curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && ./aws/install \
    && dnf clean all

RUN dnf install -y gcc \
        zlib-devel \
        bzip2-devel \
        readline-devel \
        sqlite \
        sqlite-devel \
        openssl-devel \
        tk-devel \
        libffi-devel \
        xz-devel

RUN adduser ec2-user
RUN echo 'ec2-user ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers

USER ec2-user
# Python
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv \
    && echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile \
    && echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile \
    && echo 'eval "$(pyenv init -)"' >> ~/.bash_profile \
    && source ~/.bash_profile

ARG PYTHON_VERSION="3.11.7"
RUN export PYENV_ROOT="$HOME/.pyenv" \
    && command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" \
    && eval "$(pyenv init -)" \
    && pyenv install ${PYTHON_VERSION} \
    && pyenv global ${PYTHON_VERSION} \
    && pyenv rehash

RUN curl -sSL https://install.python-poetry.org | python - \
    && echo 'export PATH="$HOME/.local/bin:${PATH}"' >> ~/.bash_profile \
    && source ~/.bash_profile

実行ユーザーについて

通常のDev Containersでは、実行ユーザーはvscodeというユーザーになります。
一方で、Amazon Linuxでは通常に利用するユーザーは、ec2-userというのがよくあるパターンかと思います。 そのため、devcontainer設定ファイルにて、remoteUserを設定しました。また、Dockerfileでもec2-userを追加して、sudo可能にしています。

環境の起動

設定ファイルの準備ができたところで、VSCodeで、Command + Shift + P キーでコマンドウインドウを起動します。
次にDev Containers: Rebuild Without Cache and Reopen in Containerと入力して、実行します。 Dockerファイルの記述に沿ったイメージの取得や各種のパッケージのインストールが開始されていることをログで確認することができます。

起動したDev Containers上で、ターミナルを起動して確認します。 下記のように確かにDockerファイルで指定した通りの環境ができています。

[ec2-user@container al2023]$ pwd
/workspaces/al2023-w2
[ec2-user@container al2023]$ whoami
ec2-user
[ec2-user@container al2023]$ aws --version
aws-cli/2.15.15 Python/3.11.6 Linux/6.5.11-linuxkit exe/aarch64.amzn.2023 prompt/off
[ec2-user@container al2023]$ python --version
Python 3.11.7

このようにインフラも含めて、VSCodeとDev Containersを使って、環境構築は非常に簡単にできます。 今回は紹介していませんが、devcontainer.jsonファイルでは、Dockerfileだけでなくdocker-composeファイルも指定することが可能なため、 実際のAWSのプログラム開発の現場でよくあるlocalstackもついでに起動しておきたいというようなニーズにも簡単に対応できそうです。 また、複数のメンバーに同じ環境を素早く提供できる点でも、Dev Containersは非常に使えるソリューションだなと思いました。


参照