Oracle Cloud が提供するコマンドラインツールは2つあります。
- Oracle Cloud Infrastructure (OCI) をコマンドラインで操作する OCI CLI
- 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 でインストールします。 ENTRYPOINT
で oci
コマンドを実行するように設定しています。
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.zip
と payload.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 ビルドを行っており、 apk
や pip
のインストールが上手く動作しない場合は、次のように 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 でも実現できるので、これらを活用して自動化を促進してみてください。
- 参考文献