OCI CLI で利用するユーザ情報を切り替える方法

Pocket

Oracle Cloud Infrastructure を操作する CUI ツールである OCI CLI 。便利でよく使っているのですが、最近色々な案件で Oracle Cloud を扱うことが増えてきて、環境ごとに別々の設定ファイルができてしまいました。

今回はそれらの管理を効率的に行う方法をご紹介します。

OCI CLI の動作に必要なファイル

OCI CLI を使うために必要なファイルは、以下のとおりです。

  • ~/.oci/config : メインの設定ファイルです。以下の内容が記述されています
    • Tenancy の OCID
    • Region 名
    • User の OCID
    • API 公開鍵のフィンガープリント
    • API 秘密鍵のファイルへのフルパス
  • ~/.oci/api_key.pem : API 秘密鍵ファイルです
  • ~/.oci/api_key_public.pem : API 公開鍵ファイルです
    • 公開鍵ファイルは動作に必須ではありませんが、OCI CLI のセットアップウィザードを使うと秘密鍵とともに生成されているはずです

~/.oci/config ファイルの内容は、セットアップ直後は次のようになっていると思われます。

[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=/PATH/TO/api_key.pem
tenancy=ocid1.tenancy.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region=ap-tokyo-1

当初、テナンシやコンパートメントの異なる環境を操作する際は、都度これら3ファイルのセットを移動・リネームして対応していました。しかしドキュメントを調べてみると、複数のプロファイルを上手く管理できることが分かりました。

OCI_CLI_PROFILE 環境変数を使う

このドキュメントの中で、 OCI_CLI_PROFILE という環境変数を指定すれば、プロファイルを切り替えられると記載がありました。早速試してみます。

まず、複数作成していた ~/.oci/config ファイルの内容を1つにマージします。単純にマージすると、以下のようになるはずです。

[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=/PATH/TO/api_key.pem
tenancy=ocid1.tenancy.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region=ap-tokyo-1

[DEFAULT]
user=ocid1.user.oc1..YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
fingerprint=YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY
key_file=/PATH/TO/api_key.pem
tenancy=ocid1.tenancy.oc1..YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
region=us-ashburn-1

[DEFAULT]
user=ocid1.user.oc1..ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
fingerprint=YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY
key_file=/PATH/TO/api_key.pem
tenancy=ocid1.tenancy.oc1..ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
region=us-phoenix-1

次に、このファイル内の記載をそれぞれ変更していきます。 ~/.oci/config ファイル内はシェルスクリプト同様、「シャープ記号 # 」でコメントが書けますので、適宜コメントを書いておくと良いでしょう。

# 某ウェブシステムの管理用プロファイル
[MY_WEB_SYSTEM]
user=ocid1.user.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
fingerprint=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
key_file=/PATH/TO/my-web-system-api_key.pem
tenancy=ocid1.tenancy.oc1..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region=ap-tokyo-1
# - テナンシ         : example_opst_oci
# - コンパートメント : my-web-system-compartment
# - API ユーザ       : my-web-system-user

# 某 API サーバの管理用プロファイル
[MY_API_SERVER]
user=ocid1.user.oc1..YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
fingerprint=YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY
key_file=/PATH/TO/my-api-server-api_key.pem
tenancy=ocid1.tenancy.oc1..YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
region=us-ashburn-1
# - テナンシ         : example_opst_api
# - コンパートメント : my-api-server-compartment
# - API ユーザ       : my-api-server-user

# 某バッチ処理システムの管理用プロファイル
[MY_BATCH]
user=ocid1.user.oc1..ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
fingerprint=YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY:YY
key_file=/PATH/TO/my-batch-api_key.pem
tenancy=ocid1.tenancy.oc1..ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
region=us-phoenix-1
# - テナンシ         : example_opst_batch
# - コンパートメント : my-batch-compartment
# - API ユーザ       : my-batch-user

変更したのは次の2点です。

  • [DEFAULT] 部分 : 3箇所ありましたが、これらを任意の プロファイル名 に変更しました。ここでは MY_WEB_SYSTEMMY_API_SERVERMY_BATCH の3つにしました
  • key_file 部分 : このあと、API 秘密鍵のファイル名をプロファイル別にリネームするので、それに合わせてファイル名を変更しておきます。

このような ~/.oci/config ファイルが用意できたら、API 秘密鍵ファイルと API 公開鍵ファイルを、 key_file プロパティに記載した要領でリネームし配置します。

  • ~/.oci/my-web-system-api_key.pem
  • ~/.oci/my-web-system-api_key_public.pem
  • ~/.oci/my-api-server-api_key.pem
  • ~/.oci/my-api-server-api_key_public.pem
  • ~/.oci/my-batch-api_key.pem
  • ~/.oci/my-batch-api_key_public.pem

こんな風にしておきます。これで準備ができました。

実際にコマンドを叩いてみる

それではターミナルを開いて、実際に OCI CLI コマンドを叩いてみましょう。適当にコンパートメント一覧でも拾ってみます。

$ oci iam compartment list --all
Usage: oci iam compartment list [OPTIONS]

Error: Missing option(s) --compartment-id.

おや、エラーになりました。普段は --compartment-id オプションを渡さずとも実行できるのに、おかしいですね。

それもそのはず。先程 ~/.oci/config ファイルから [DEFAULT] というプロファイルを削除してしまったので、いきなり oci コマンドを実行したときに参照すべきプロファイルが存在しなくなっているのです。

ここで OCI_CLI_PROFILE 環境変数を使います。先程指定したプロファイル名を渡して、次のように記述します。

$ export OCI_CLI_PROFILE=MY_WEB_SYSTEM

このあと oci コマンドを実行すれば、 [MY_WEB_SYSTEM] プロファイルで指定した API ユーザに許可された範囲で、OCI CLI コマンドが実行できます。

次に、別のプロファイルで oci コマンドを使いたくなったときは、同じ要領で

$ export OCI_CLI_PROFILE=MY_API_SERVER

のように OCI_CLI_PROFILE 環境変数を再設定してあげれば、今度は [MY_API_SERVER] プロファイルで OCI コマンドが使用できます。

一番よく使うプロファイルは [DEFAULT] で記載しておけば、 OCI_CLI_PROFILE 環境変数を指定しなかったときにその接続情報が使用されるので、このあたりは自分の用途に応じて設定してみてください。

定義したプロファイルを取得するスクリプト

このように、複数のプロファイルを ~/.oci/config ファイル1つに定義し、 OCI_CLI_PROFILE 環境変数で切り替える方法が分かりました。

プロファイル数があまり増減しないのであれば、次のようなエイリアスを作成して ~/.bashrc あたりに定義しておいても良いかもしれません。

alias oci-use-web='export OCI_CLI_PROFILE=MY_WEB_SYSTEM'
alias oci-use-api='export OCI_CLI_PROFILE=MY_API_SERVER'
alias oci-use-bat='export OCI_CLI_PROFILE=MY_BATCH'

これで、 oci-use-web エイリアスを実行してから oci コマンドを叩く、というような運用になります。

プロファイルの数が多い場合は、以下のようなワンライナーで ~/.oci/config ファイルを検索すると良いでしょう。

$ grep -E '^\[' -B 1 ~/.oci/config | sed 's/\[\(.*\)\]/export OCI_CLI_PROFILE='\''\1'\''/g'

# 某ウェブシステムの管理用プロファイル
export OCI_CLI_PROFILE='MY_WEB_SYSTEM'
--
# 某 API サーバの管理用プロファイル
export OCI_CLI_PROFILE='MY_API_SERVER'
--
# 某バッチ処理システムの管理用プロファイル
export OCI_CLI_PROFILE='MY_BATCH'

やっていることは、 grep コマンドで [ から始まる行 (= プロファイル名の行) を抽出し、それを sed で置換し export OCI_CLI_PROFILE の形式にしています。

grep-B 1 オプションを使用して、ヒットした行の1つ上の行も表示しています。前述のような ~/.oci/config ファイルの書き方にしていれば、プロファイル名の1行上にはコメントがあるので、コメントを見ながら使用したいプロファイルを特定できるというわけです。

まとめ

OCI CLI で複数の環境を扱いたい場合は、 ~/.oci/config と記述と秘密鍵ファイルの名前を調整しておき、 OCI_CLI_PROFILE 環境変数を用いて接続するプロファイルを切り替えられることが分かりました。

複数のテナンシを使うことは少ないとしても、1つのテナンシで複数のリージョンを操作する場合はあるかと思います。OCI CLI のプロファイルは region プロパティの指定もありますので、「日本リージョンを操作するプロファイル」「北米リージョンを操作するプロファイル」という風に、プロファイルを作り分けておいても良いかと思います。

Pocket

コメントを残す

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