OCI CLI と PSM CLI を Docker コンテナで構築する

Pocket

Oracle Cloud が提供するコマンドラインツールは2つあります。

  1. Oracle Cloud Infrastructure (OCI) をコマンドラインで操作する OCI CLI
  2. Oracle Java Cloud Service などの Oracle PaaS をコマンドラインで操作できる PSM CLI (PaaS Manager Command Line Interface)

いずれも Python 製のツールで、pip を使用してインストールします。Python に慣れていないと、よく分からないエラーが多発して、インストールでつまづくことが多いです。そこで、Docker コンテナでこれらの CLI ツールの実行環境を作ってみます。

OCI CLI の Docker コンテナを作成する

まずは OCI CLI の Docker コンテナの作り方を紹介します。

Docker イメージを作る

早速、次のような Dockerfile を作ります。

FROM python:3.8.0-alpine3.10

RUN set -xe && \
    apk add --no-cache --update \
      alpine-sdk \
      libffi \
      libffi-dev \
      openssl \
      openssl-dev && \
    pip install --upgrade pip && \
    pip install --no-cache-dir \
      oci \
      oci-cli

ENTRYPOINT ["/usr/local/bin/oci"]

Python がインストール済みの Alpine Linux イメージをベースに、依存ライブラリをインストール後、OCI CLI を pip でインストールします。 ENTRYPOINToci コマンドを実行するように設定しています。

Dockerfile ができたら、次のように Docker ビルドします。

$ docker build -t oci-cli .

OCI CLI プロファイルを用意する

続いて、ホストマシン (ローカル) の ~/.oci/ ディレクトリ配下に、OCI CLI のプロファイルを用意しますが、ここで一つだけ注意があります。

~/.oci/config 内で key_file を指定する部分で、通常は /Users/me/.oci/api-key.pem といったようにフルパスを記載していると思いますが、ここを ~/.oci/api-key.pem という風に記載してください。次のようになります。

[DEFAULT]
user=ocid1.user.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
fingerprint=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
key_file=~/.oci/api-key.pem
tenancy=ocid1.tenancy.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region=ap-tokyo-1

Docker コンテナを実行する

ここまでできたら準備完了です。実際にコマンドを叩いてみます。

$ docker run -it --rm -v "${HOME}/.oci:/root/.oci" oci-cli:latest iam compartment list --all

このコマンドは、

$ oci iam compartment list --all

に相当します。コンパートメントの一覧が返ってくれば、ホストマシンの ~/.oci/config を正しく利用して OCI CLI が実行できています。

関数で簡略化する

都度 docker run コマンドを書くのは大変なので、関数を用意しておきます。これを ~/.bashrc などに記載しておきます。

oci() { docker run -it --rm -v "${HOME}/.oci:/root/.oci" oci-cli:latest "$@"; }

このように関数を定義しておけば、通常の OCI CLI と同じように

$ oci iam compartment list --all

などと実行できるようになります。

PSM CLI の Docker コンテナを作成する

次は PSM CLI の Docker コンテナの作り方を紹介します。

Docker イメージを作る

次のような Dockerfile を作ります。

FROM python:3.8.0-alpine3.10

ARG username
ARG password
ARG identity_domain
ARG region
ARG data_center
ARG output_format

WORKDIR /root

RUN set -xe && \
    apk add --no-cache --update \
      curl && \
    pip install --upgrade pip && \
    curl -X GET \
         -u "${username}:${password}" \
         -H "X-ID-TENANT-NAME:${identity_domain}" \
         "https://${data_center}/paas/core/api/v1.1/cli/${identity_domain}/client" \
         -o psmcli.zip && \
    pip install -U psmcli.zip && \
    echo "{ \"username\": \"${username}\", \"password\": \"${password}\", \"identityDomain\": \"${identity_domain}\", \"region\": \"${region}\", \"outputFormat\": \"${output_format}\" }" > payload.json && \
    psm setup --config-payload payload.json && \
    rm psmcli.zip payload.json


ENTRYPOINT ["/usr/local/bin/psm"]

OCI CLI よりもちょっと長くなりました。

PSM CLI はインストール用の Zip ファイルを Oracle からダウンロードして使用します。そして、OCI CLI でいうプロファイルはファイルで用意するのではなく、予め psm setup コマンドで設定しておく必要があります。つまり作成した Docker イメージには PSM CLI に関するクレデンシャル情報が含まれた状態になるので、 ビルドしたイメージを DockerHub に Push したりしないよう注意してください。 インストール中に使用するファイル psmcli.zippayload.json は、インストールが完了したら削除しています。

Dockerfile ができたら、次のようにビルドします。

$ docker build -t psm-cli . \
  --build-arg username='【ユーザ名】' \
  --build-arg password='【パスワード】' \
  --build-arg identity_domain='【アイデンティティ・ドメイン】' \
  --build-arg region='【リージョン】' \
  --build-arg data_center='psm.【リージョン】.oraclecloud.com' \
  --build-arg output_format='json'

PSM CLI を使えるユーザ・アカウントの情報を引数で指定していきます。

  • 「アイデンティティ・ドメイン」は、 idcs- から始まる文字列です
  • 「リージョン」は、日本リージョンの場合は aucom 、米国リージョンの場合は us を指定します
  • PSM CLI の出力形式は 'json' に設定していますが、任意で 'short' 等に変更可能です

Docker コンテナを実行する

ここまでできたら準備完了です。実際にコマンドを叩いてみます。

$ docker run -it --rm psm-cli:latest setup -p

このコマンドは、

$ psm setup -p

に相当します。Docker ビルド時にセットアップした PSM CLI の情報を出力するためのコマンドです (-p--print-configured-options の省略形)。ユーザ名やアイデンティティ・ドメインなどが正しく表示されていれば、PSM CLI が正しく動作する状態になっています。

関数で簡略化する

こちらも OCI CLI 同様、簡単な関数を用意しておくと、通常の PSM CLI と同じ感覚でコマンド入力できるようになります。次の関数を ~/.bashrc などに記載しておきます。

psm() { docker run -it --rm psm-cli:latest "$@"; }

このような関数をしておけば、

$ psm jcs services

といったように実行できるようになります。

うまく動かない場合は…

プロキシ環境下で Docker ビルドを行っており、 apkpip のインストールが上手く動作しない場合は、次のように Dockerfile を編集してみてください。

# プロキシ設定を環境変数に設定する (RUN 命令より手前に記載する)
ENV http_proxy 【プロキシ URL:ポート】
ENV https_proxy 【プロキシ URL:ポート】
ENV HTTP_PROXY 【プロキシ URL:ポート】
ENV HTTPS_PROXY 【プロキシ URL:ポート】
# 例えば次のように記載します
#ENV HTTPS_PROXY https://my-proxy.com:8000

# pip install で「SSL wrong version number」エラーが出る場合は次のようにオプション引数を設定する
RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org ……【以下略】……

Docker ビルドは成功したが思ったように動作しない、という場合は、Alpine Linux のシェルにログインして確認するのが楽かと思います。次のように実行してみてください。

# OCI CLI コンテナの場合
$ docker run -it --rm --entrypoint='/bin/sh' -v "${HOME}/.oci:/root/.oci" oci-cli:latest

# PSM CLI コンテナの場合
$ docker run -it --rm --entrypoint='/bin/sh' psm-cli:latest

まとめ

OCI CLI と PSM CLI は、Python・pip をベースに動作するので、ホストマシンの Python 環境によってインストールが失敗したり、アップグレードすると動かなくなったりすることがありました。CLI の実行環境を Docker コンテナに閉じ込めてやれば、ホストマシンの環境に影響を受けることなく、いつでも CLI が使えます。

また、今回のようにコマンドを Docker コンテナ化できると、CI/CD において作業を自動化する際にも役立ちます。Oracle Cloud はブラウザの管理コンソール上で出来る操作はほぼ全て CLI でも実現できるので、これらを活用して自動化を促進してみてください。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です