« Oracle Cloud Infrastructure Archive Storage | メイン | OCI Virtual Machine DBシステムのバックアップ構成 »

Oracle Cloud Infrastructure CLIについてのメモ

渡部です。これは、(全部俺) Oracle Cloud Infrastructure Advent Calendar 2018 の16日目のエントリです。

昨今のクラウドインフラの例に倣い、Oracle Cloud Infrastructure(以下OCI)もCLIで管理作業を実行できます。

CLI使用前の構成などについては、以下のドキュメントが詳しいです。

ここでは細かめの注意点などをメモ的にまとめておきます。

OCI CLIで複数のプロファイルを使い分ける

CLI使用前の構成で使用する oci setup config において、複数プロファイルの関する点がないため混乱しがちなのですが、 AWS CLIと同様にOCI CLIでは複数のプロファイルを使い分けることができます。プロファイルは、OCIの環境/認証設定であり、たいていの場合、1つのプロファイルが1つのIAMユーザーに対応します。逆にいえば、複数のIAMユーザーを使い分けたい場合は、通常複数のプロファイルを使い分けることになります。

どうやら、oci setup configは複数プロファイルに対応していないようです。とはいえ、oci setup configのやっていることは~/.oci/configの新規作成に過ぎないので、直接~/.oci/configを編集してしまえば、複数プロファイルを構成できます。

$ cat ~/.oci/config
[admin01]
user=ocid1.user.oc1..aaa<略>ixa
fingerprint=24:00:<略>:15
key_file=/home/rywatabe/.oci/oci_api_key__admin01.pem
tenancy=ocid1.tenancy.oc1..aaa<略>faa
region=us-ashburn-1
[noprivs01]
user=ocid1.user.oc1..aaa<略>f4q
fingerprint=a5:bd:<略>:bc
key_file=/home/rywatabe/.oci/oci_api_key__noprivs01.pem
tenancy=ocid1.tenancy.oc1..aaa<略>faa
region=us-ashburn-1

複数構成されたプロファイルのうち、どのプロファイルを使用するかは、以下の方法で指定できます。

  • --profileオプションで指定された値。
  • OCI_CLI_PROFILE環境変数で指定された値。
  • ~/.oci/configのOCI_CLI_SETTINGSセクションのdefault_profileフィールドで指定された値。

ただ、3番目のOCI_CLI_SETTINGSセクションのdefault_profileフィールドの方法はうまく動かないような・・・

$ oci --profile=admin01 os bucket list
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1..aaa<略>gqa",
      "created-by": "ocid1.user.oc1..aaa<略>sxq",
      "defined-tags": null,
      "etag": "a7db3306-5e4c-49f7-908f-b2aeeb7fb9fb",
      "freeform-tags": null,
      "name": "bk1",
      "namespace": "cosoltest01",
      "time-created": "2018-08-10T06:19:31.305000+00:00"
    },
      :
  ]
}
$ oci --profile=noprivs01 os bucket list
ServiceError:
{
    "code": "NamespaceNotFound",
    "message": "You do not have authorization to perform this request, or the requested resource could not be found.",
    "opc-request-id": "aed3adce-92ae-3700-213e-5427e86872ca",
    "status": 404
}


$ export OCI_CLI_PROFILE=admin01
$ oci os bucket list
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1..aaa<略>gqa",
      "created-by": "ocid1.user.oc1..aaa<略>sxq",
      "defined-tags": null,
      "etag": "a7db3306-5e4c-49f7-908f-b2aeeb7fb9fb",
      "freeform-tags": null,
      "name": "bk1",
      "namespace": "cosoltest01",
      "time-created": "2018-08-10T06:19:31.305000+00:00"
    },
      : 
  ]
}

OCI CLIのアップデート

当然ですが、日々強化されるOracle Cloud Infrastructureの機能拡張に追随するためには、OCI CLIもアップデートを行う必要があります。OCI CLIはPythonのパッケージマネージャ pipで管理されていますから、pip install oci-cli --upgradeでアップグレード可能です。

以下にOCI CLIアップグレードの実行例を示します。

$ oci --version
2.4.29
$ pip list --o
Package         Version   Latest     Type
--------------- --------- ---------- -----
arrow           0.10.0    0.12.1     sdist
certifi         2018.4.16 2018.10.15 wheel
click           6.7       7.0        wheel
cryptography    2.1.3     2.4.2      wheel
idna            2.6       2.7        wheel
oci             2.0.0     2.1.1      wheel
oci-cli         2.4.29    2.4.38     wheel
pycparser       2.18      2.19       sdist
pyOpenSSL       17.4.0    18.0.0     wheel
python-dateutil 2.7.3     2.7.5      wheel
pytz            2016.10   2018.7     wheel
setuptools      28.8.0    40.6.2     wheel
$ pip install oci-cli --upgrade
Collecting oci-cli
  Downloading https://files.pythonhosted.org/packages/10/19/746dea1d182e051324696b87cb37b34b2b44ad227120e07500cb1d3f25d7/oci_cli-2.4.38-py2.py3-none-any.whl (2.3MB)
      :
Installing collected packages: oci, cx-Oracle, oci-cli
  Found existing installation: oci 2.0.0
    Uninstalling oci-2.0.0:
      Successfully uninstalled oci-2.0.0
  Found existing installation: oci-cli 2.4.29
    Uninstalling oci-cli-2.4.29:
      Successfully uninstalled oci-cli-2.4.29
Successfully installed cx-Oracle-6.2.1 oci-2.1.1 oci-cli-2.4.38
$ oci --version
2.4.38
$ pip list --o
Package         Version   Latest     Type
--------------- --------- ---------- -----
arrow           0.10.0    0.12.1     sdist
certifi         2018.4.16 2018.10.15 wheel
click           6.7       7.0        wheel
cryptography    2.1.3     2.4.2      wheel
cx-Oracle       6.2.1     7.0.0      wheel
idna            2.6       2.7        wheel
pycparser       2.18      2.19       sdist
pyOpenSSL       17.4.0    18.0.0     wheel
python-dateutil 2.7.3     2.7.5      wheel
pytz            2016.10   2018.7     wheel
setuptools      28.8.0    40.6.2     wheel
$

テナントのOCID取得方法

OCI CLI構成時には、テナント(アカウント)のOCIDが必要です。 従来、テナントのOCIDは管理コンソールのフッターに表示されていましたが、2018年9月のアップデートからフッター表示がなくなり、テナントの詳細("Tenancy Details "ページ)から確認するようになっています。

JMESPATHフィルタで単一の値を取得する

一連のCLI実行をシェルスクリプト化する場合など、 JMESPATHフィルタを使って条件に合致する特定のOCIDを取得し、シェルの変数に格納したいケースがあります。

ただし、以下のようなコマンドを実行しても、予期した結果になりません。

$ VCN_NAME=test03VCN
$ VCN_OCID=$( oci network vcn list --query 'data[?"display-name"==`'${VCN_NAME}'`].id' )
$ echo "${VCN_OCID}"
[
  "ocid1.vcn.oc1.iad.aaaaaaaav6w...<略>.......................................2wq"
]

フィルタは実質的にプロジェクションなので、フィルタにマッチする要素が1つだけの場合でも戻り値がarrayとして返されます。よって、arrayをリテラル値に"unwrap"する操作が必要です。

また、JSONでは、文字列は"..."でクォートされるため、これを取り除く必要もあります。

以下のように変更すると、予期した動作を実現できます。

$ VCN_NAME=test03VCN
$ VCN_OCID=$( oci network vcn list --query 'data[?"display-name"==`'${VCN_NAME}'`].id | [0]' --raw-output )
echo "${VCN_OCID}"
$ echo "${VCN_OCID}"
ocid1.vcn.oc1.iad.aaaaaaaav6w...<略>.......................................2wq

ポイントは以下です。

  • パイプ処理 "|" と配列の0番目の要素へのアクセス"[0]" を使って、arrayをリテラル値にunwrapしています。
  • --raw-outputオプションを指定して、文字列のクォートを無効化しています。

--all に注意

複数件のデータを返すCLIコマンドを実行すると、対象件数が多い場合は返される件数が限定されることがあります。 --allオプションを指定すると、件数を限定せず全件が返されます。

About

2018年12月16日 09:00に投稿されたエントリーのページです。

ひとつ前の投稿は「Oracle Cloud Infrastructure Archive Storage」です。

次の投稿は「OCI Virtual Machine DBシステムのバックアップ構成」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。