Docker コンテナで動く pcluster コマンドの実行環境の作り方紹介

2023.06.03

AWS ParallelCluster の管理コマンド(pclusterコマンド)の実行環境の作り方を紹介します。同じ実行環境を配布できるように実行環境には Docker コンテナを使用します。

実行環境の構築に必要なファイル

以下のリポジトリに保存してあります。M1 Mac(ARM)仕様の部分が一部ありますので x86-64 ユーザーが参考にされる場合は本文もご確認ください。

bigmuramura/container-pculster-command: Exeute pcluter commnad on Docker

コンテナへログインするまでの手順早見

git clone https://github.com/bigmuramura/container-pculster-command.git
docker-compose build
docker-compose up -d
docker-compose exec pcluster fish

実行環境作成

pclusterコマンドの実行環境は以下のリンクの参考を元に Docker ファイルを作成します。

以下の方針でコンテナ環境を作成します

  • pclusterコマンドのバージョン管理ができること
  • Node.js のバージョン管理ができること
  • pclusterコマンドで実行可能なコンテナ内で必要になりそうなコマンドもインストールしておく
    • AWS CLI や、jq コマンドなど
  • AWS の認証情報は Assume ROle で得たクレデンシャルを使う

コンテナイメージの選定

前提条件を確認し、特定の OS の中で Node.js のインストール必須でした。node のベースイメージで ubuntu / debian 系のイメージを使用しているものを採用しました。

node - Official Image | Docker Hub

ParallelCluster のアップデートにより、要求される Node.js のバージョンが上がれば node のベースイメージを変更して更新する運用にします。

その他あると便利なもの

AWS CLI コマンドを利用できるようにしておきます。あとは私がfishシェルユーザーなのでfishシェルを使えるようにします。

Docker ファイル作成

AWS CLI のソースコードは ARM 用のものをダウンロードしています。x86-64 環境の場合は該当するソースコードをダウンロードするように変更してください。

Dockerfile

FROM debian:stable as builder

WORKDIR /tmp

RUN apt-get update && apt-get install -y \
  curl \
  unzip

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip

FROM node:20.2.0-bullseye

# Type the pcluster version you want to use
ENV PCLUSTER_VERSION=3.6.0

COPY --from=builder /tmp/aws /tmp/aws
RUN /tmp/aws/install
RUN apt-get update && apt-get install -y \
  python3=3.9.2-3 \
  python3-pip \
  git \
  jq \
  fish \
  vim \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

RUN pip3 install aws-parallelcluster==$PCLUSTER_VERSION \
  && mkdir /work

docker-compose ファイル作成

ParallelCluster のクラスターのコンフィグファイルを保存しておくディレクトリを/workとしてコンテナ側にマウントして、ワークフロー定義で使用するディレクトリや、ファイルをローカルからとコンテナからどちらかもアクセスできるようにしてあります。

docker-compose.yaml

version: '3'

services:
  pcluster:
    build:
      context: ./pcluster
      dockerfile: Dockerfile
    volumes:
      - ./configs:/work:cached
      - ~/.aws:/root/.aws
    tty: true

ディレクトリ構成

pclusterディレクトリ配下にDockerfileを保存しています。configsディレクトリは ParallelCluster のクラスターコンフィグを保存することを想定しています。

.
├── README.md
├── configs
│   └── aaa.txt
├── docker-compose.yaml
└── pcluster
    └── Dockerfile

イメージのビルド・実行

イメージをビルドしてコンテナを起動します。

docker-compose build
docker-compose up -d
docker-compose exec pcluster fish

コンテナが正常にビルド、コンテナ起動、ログインすると以下の様なプロンプトが表示されます。

Welcome to fish, the friendly interactive shell
Type `help` for instructions on how to use fish
root@0eb783a5b930 /#

バージョン確認

pclusterコマンドが利用できるか、意図したバージョンの情報が返ってくるかチェックしましょう。

コンテナ内

# pcluster version
{
  "version": "3.6.0"
}

pclusterコマンドで AWS 環境を操作するにはコンテナ内から AWS アカウントへの認証情報が必要になります。私はローカルマシンで Assume Role から一時的な権限を取得してコンテナ内に貼り付けて利用しています。

コンテナ内

export AWS_DEFAULT_REGION="ap-northeast-1"
export AWS_ACCESS_KEY_ID="hoge"
export AWS_SECRET_ACCESS_KEY="hoge"
export AWS_SESSION_TOKEN="hoge"

ローカルマシンの~/.awsディレクトリは/root/.awsにマウントしてあります。お好みの方法でコンテナ内に AWS の認証情報を渡してください。

# pwd
/root/.aws
# ll
total 12K
drwxr-xr-x 1 502 dialout  96 Aug 13  2022 cli/
-rw-rw-r-- 1 502 dialout 298 Jan 17 06:11 config
-rw-rw-r-- 1 502 dialout 186 Jun  4  2022 credentials

以上で pclusterコマンドの実行環境構築完了です。

ParallelCluster のアップデート対応

ここでは私の普段の運用方法を紹介します。

ParallelCluster バージョンのアップデートに合わせて、必要な各種ライブラリのバージョンが変更になる可能性があります。最新情報はユーザーガイドを参照してください。

Installing the AWS ParallelCluster command line interface (CLI) - AWS ParallelCluster

Dockerfile 修正

ENV PCLUSTER_VERSION=で指定しているバージョン番号を修正します。

Dockerfile

FROM debian:stable as builder

WORKDIR /tmp

RUN apt-get update && apt-get install -y \
  curl \
  unzip

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip

FROM node:20.2.0-bullseye

# Type the pcluster version you want to use
ENV PCLUSTER_VERSION=3.6.0

COPY --from=builder /tmp/aws /tmp/aws
RUN /tmp/aws/install
RUN apt-get update && apt-get install -y \
  python3=3.9.2-3 \
  python3-pip \
  git \
  jq \
  fish \
  vim \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

RUN pip3 install aws-parallelcluster==$PCLUSTER_VERSION \
  && mkdir /work

再ビルド

--no-chacheオプションを付けてビルドします。

docker-compose build --no-cache
docker-compose up -d
docker-compose exec pcluster fish

普段のアップデート対応はこれだけです。動かなかったときに考えようと思っていますがまだ訪れていません。

おわりに

検証をよくするのでローカルマシンでクラスターのコンフィグを書いて、クラスターの作成まで完結させたかったです。かつ、ローカル環境を汚したくないのでコンテナを利用しここ1年ほどは本環境を利用しています。以前は VS Code リモートコンテナを利用していたのですが Docker Desktop から、Rancher Desktop に切り替えてから機能しなくなったので、シンプルに docker-compose を利用しています。