技術ブログ
目次
渡部です。これは、(全部俺) Oracle Cloud Infrastructure Advent Calendar 2018 の16日目のエントリです。
昨今のクラウドインフラの例に倣い、Oracle Cloud Infrastructure(以下OCI)もCLIで管理作業を実行できます。
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..aaaixa
fingerprint=24:00::15
key_file=/home/rywatabe/.oci/oci_api_key__admin01.pem
tenancy=ocid1.tenancy.oc1..aaafaa
region=us-ashburn-1
[noprivs01]
user=ocid1.user.oc1..aaaf4q
fingerprint=a5:bd::bc
key_file=/home/rywatabe/.oci/oci_api_key__noprivs01.pem
tenancy=ocid1.tenancy.oc1..aaafaa
region=us-ashburn-1
複数構成されたプロファイルのうち、どのプロファイルを使用するかは、以下の方法で指定できます。
ただ、3番目のOCI_CLI_SETTINGSセクションのdefault_profileフィールドの方法はうまく動かないような・・・
$ oci --profile=admin01 os bucket list
{
"data": [
{
"compartment-id": "ocid1.compartment.oc1..aaagqa",
"created-by": "ocid1.user.oc1..aaasxq",
"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..aaagqa",
"created-by": "ocid1.user.oc1..aaasxq",
"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"
},
:
]
}
当然ですが、日々強化される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
$
OCI CLI構成時には、テナント(アカウント)のOCIDが必要です。 従来、テナントのOCIDは管理コンソールのフッターに表示されていましたが、2018年9月のアップデートからフッター表示がなくなり、テナントの詳細("Tenancy Details "ページ)から確認するようになっています。
一連の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
ポイントは以下です。
複数件のデータを返すCLIコマンドを実行すると、対象件数が多い場合は返される件数が限定されることがあります。 --allオプションを指定すると、件数を限定せず全件が返されます。