Oracle Cloud [OCI]: oci-cliを使いVMの一覧をタグで絞り込み出力する

Cloudの様々なリソースに対して、タグ付けを行い管理を行うことがあるかと思います。
今回はOCIのComputeにFreeform-tagを付与した後、"--query"オプションを用いて特定のタグの値のインスタンスの情報のみをoci-cliで出力する方法を記載します。

"--query"オプションは、JMESPathのクエリを使うことで、出力結果をフィルタリングするオプションで、
下記のサイトがとてもわかりやすいです。

<a href="https://cosol.jp/techdb/2018/12/jmespath_expression/">JMESPATH式
</a>

今回はAlways Free環境で試しました。


■参考にさせて頂いた記事
<a href="https://community.oracle.com/tech/welcome/discussion/4474263/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3-cli-%E3%81%A7oci%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B-oracle-cloud-infrastructure%E3%82%A2%E3%83%89%E3%83%90%E3%83%B3%E3%82%B9%E3%83%89">コマンドライン(CLI)でOCIを操作する - Oracle Cloud Infrastructureアドバンスド
</a>

<a href="https://qiita.com/feifo/items/5789ee7a724c6cb786a9">Oracle Cloud(OCI)のcliのinput/outputで使うjsonに慣れる
</a>


##作業手順
1.Computeインスタンスにタグを付与
2.付与したタグの確認
3.動作確認

###今回使用したサービスと技術
・OCI Compute
・OCI Tagging 
・oci-cli

###著者の環境
Mac OS X 10.15.7
Oracle Cloud Always Free環境

##1.Computeインスタンスにタグを付与
今回はOracle Cloud Always Free環境にて、２つのインスタンスを作成し、
各インスタンスとタグ・ネームスペース、タグ・キー、値を下表のように設定します。

インスタンス作成時に「CreatedBy」タグと「CreatedOn」タグが自動生成されますが、
今回はフリーフォーム・タグを使用して、絞り込み出力を行います。

| インスタンス名 | タグ・ネームスペース | タグ・キー | 値 |
| :---: | :---: | :---:  | :---: |
| FreeVM1 | なし（フリーフォーム・タグ） | Project | test |
| FreeVM2 | なし（フリーフォーム・タグ） | Project | dev |

タグの追加方法
インスタンスの詳細画面上部にある「他のアクション」ボタンをクリックします。
「タグの追加」が表示されますので、選択します。
![compute-tag1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487835/4eb07482-17ff-05cd-8102-de679da70e43.jpeg)

このリソースに１つ以上のタグを追加　ダイアログボックスが表示されます。
タグ・ネームスペースを選択し、タグ・キー、値を入力後、「タグの追加」をクリックします。
![compute-tag2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487835/a311dbe8-2a14-3004-13d5-9c4431a94488.jpeg)

■Computeインスタンスの作成方法
今回は作成方法を割愛いたしましたが、こちらの記事がとてもわかりやすいです。
<a href="https://qiita.com/manaki/items/0ded6b4e25c2f57b3657">【OCI】oracle cloud -仮想マシン(Compute)作成編-【初心者向け】
</a>

##2.追加したタグの確認

インスタンスの詳細画面で、画面上部に表示される「タグ」タブを選択します。
デフォルト表示では「定義されたタグ」が表示されているため、「フリーフォーム・タグ」タブを選択します。
前項で追加したタグ・キーと値が表示されていることを確認します。

![compute-tag3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487835/971307d8-bf35-a3b6-4332-168991601f40.jpeg)　

##3.動作確認
ターミナルから下記コマンドを入力します。
<b>値はバッククォートで囲む必要があります。</b>

シングルクォートで囲んだ場合は「Query returned empty result, no output to show.」と表示されてしまい、情報を取得することができませんのでご注意ください。

```terminal
oci compute instance list --query 'data[?"freeform-tags".Project == `test`]'
```

２つのインスタンスのうち、Projectタグの値がtestとなっている、FreeVM1のみが出力されていることを確認します。

```terminal
[
  {
    "agent-config": {
      "is-management-disabled": false,
      "is-monitoring-disabled": false
    },
    "availability-config": {
      "recovery-action": "RESTORE_INSTANCE"
    },
    "availability-domain": "ToKy:US-ASHBURN-AD-1",
    "compartment-id": "ocid1.tenancy.oc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "dedicated-vm-host-id": null,
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "oracleidentitycloudservice/ipaccho@xxx.xxx",
        "CreatedOn": "2020-07-30T01:03:03.890Z"
      }
    },
    "display-name": "FreeVM1",
    "extended-metadata": {},
    "fault-domain": "FAULT-DOMAIN-3",
    "freeform-tags": {
      "Project": "test"
    },
    "id": "ocid1.instance.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "image-id": "ocid1.image.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "instance-options": {
      "are-legacy-imds-endpoints-disabled": false
    },
    "ipxe-script": null,
    "launch-mode": "PARAVIRTUALIZED",
    "launch-options": {
      "boot-volume-type": "PARAVIRTUALIZED",
      "firmware": "UEFI_64",
      "is-consistent-volume-naming-enabled": true,
      "is-pv-encryption-in-transit-enabled": false,
      "network-type": "PARAVIRTUALIZED",
      "remote-data-volume-type": "PARAVIRTUALIZED"
    },
    "lifecycle-state": "RUNNING",
    "metadata": {
      "ssh_authorized_keys": "ssh-rsa xxxxxxxxxxxxxxxxxxxxx== ipaccho@MacBook-Pro.local"
    },
    "region": "iad",
    "shape": "VM.Standard.E2.1.Micro",
    "shape-config": {
      "gpu-description": null,
      "gpus": 0,
      "local-disk-description": null,
      "local-disks": 0,
      "local-disks-total-size-in-gbs": null,
      "max-vnic-attachments": 1,
      "memory-in-gbs": 1.0,
      "networking-bandwidth-in-gbps": 0.48,
      "ocpus": 1.0,
      "processor-description": "2.0 GHz AMD EPYC\u2122 7551 (Naples)"
    },
    "source-details": {
      "boot-volume-size-in-gbs": null,
      "image-id": "ocid1.image.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "kms-key-id": null,
      "source-type": "image"
    },
    "system-tags": {
      "orcl-cloud": {
        "free-tier-retained": "true"
      }
    },
    "time-created": "2020-07-30T01:03:04.754000+00:00",
    "time-maintenance-reboot-due": null
  }
]

```


##参考

■oci-cli公式マニュアル
<a href="https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.21.1/oci_cli_docs/cmdref/compute/instance/list.html"> OCI CLI Command Reference 2.21.1 list</a>

■OCI公式ドキュメント
<a href="https://docs.oracle.com/ja-jp/iaas/Content/Tagging/Concepts/taggingoverview.htm"> タグ付けの概要</a>

■jmespath公式サイト
<a href="https://jmespath.org/">JMESPath</a>


###再掲
■参考にさせて頂いた記事
<a href="https://community.oracle.com/tech/welcome/discussion/4474263/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3-cli-%E3%81%A7oci%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B-oracle-cloud-infrastructure%E3%82%A2%E3%83%89%E3%83%90%E3%83%B3%E3%82%B9%E3%83%89">コマンドライン(CLI)でOCIを操作する - Oracle Cloud Infrastructureアドバンスド
</a>
<a href="https://qiita.com/feifo/items/5789ee7a724c6cb786a9">Oracle Cloud(OCI)のcliのinput/outputで使うjsonに慣れる
</a>
<a href="https://cosol.jp/techdb/2018/12/jmespath_expression/">JMESPATH式
</a>
<a href="https://qiita.com/manaki/items/0ded6b4e25c2f57b3657">【OCI】oracle cloud -仮想マシン(Compute)作成編-【初心者向け】
</a>