[Oracle Cloud] OCI CLI で引数に与えるJSONをどうすればいいのか分からないとき

# はじめに

Oracle Cloud Infrastructure(以下OCI)のCLIコマンドで、一部のパラメータはJSONを読み込ませる必要があります。このJSONが若干複雑で、どういったフォーマットを指定すればよいかよくわからない問題に出会います。

これに対応するために、パラメータのテンプレートを生成することが出来ます。
テンプレートを使用すると非常に便利にOCI CLI を活用することができるので、方法を紹介します

仮想ネットワークのVCNに存在する Security List を例として取り上げて紹介していきます。



# コマンド全体のパラメータをJSONで渡す

OCI CLI の全てのコマンドは、パラメータ全体をJSONで定義することが出来ます。
例えば、Security List を作成するコマンドは多くのパラメータが存在していますが、
`--generate-full-command-json-input` の引数を渡すことで、
すべてのパラメータのJSONのテンプレートを生成することが出来ます。

```
> oci network security-list create --generate-full-command-json-input
{
  "compartmentId": "string",
  "definedTags": {
    "string1": {
      "string1": {
        "string1": "string",
        "string2": "string"
      },
      "string2": {
        "string1": "string",
        "string2": "string"
      }
    },
    "string2": {
      "string1": {
        "string1": "string",
        "string2": "string"
      },
      "string2": {
        "string1": "string",
        "string2": "string"
      }
    }
  },
  "displayName": "string",
  "dn": "string",
  "egressSecurityRules": [
    {
      "destination": "string",
      "destinationType": "string",
      "icmpOptions": {
        "code": 0,
        "type": 0
      },
      "isStateless": true,
      "protocol": "string",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      },
      "udpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      }
    },
    {
      "destination": "string",
      "destinationType": "string",
      "icmpOptions": {
        "code": 0,
        "type": 0
      },
      "isStateless": true,
      "protocol": "string",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      },
      "udpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      }
    }
  ],
  "freeformTags": {
    "string1": "string",
    "string2": "string"
  },
  "ingressSecurityRules": [
    {
      "icmpOptions": {
        "code": 0,
        "type": 0
      },
      "isStateless": true,
      "protocol": "string",
      "source": "string",
      "sourceType": "string",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      },
      "udpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      }
    },
    {
      "icmpOptions": {
        "code": 0,
        "type": 0
      },
      "isStateless": true,
      "protocol": "string",
      "source": "string",
      "sourceType": "string",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      },
      "udpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      }
    }
  ],
  "maxWaitSeconds": 0,
  "vcnId": "string",
  "waitForState": "PROVISIONING|AVAILABLE|TERMINATING|TERMINATED",
  "waitIntervalSeconds": 0
}
```



上で生成したテンプレートを使用して、適宜必要なパラメータを書き換えることで、適切なJSONパラメータを構築することが出来ます。



# コマンドの一部のパラメータをJSONで渡す

コマンドに必要なパラメータの一部をJSONで引き渡すことが出来ます。
Security List の中で、`--egress-security-rules`や`--ingress-security-rules`がこれに該当します。

`--egress-security-rules` のテンプレートを、以下のコマンドで生成することが出来ます。
`--generate-param-json-input` の後ろに、生成したいパラメータ名を指定する形です。

```
> oci network security-list create --generate-param-json-input egress-security-rules
[
  {
    "destination": "string",
    "destinationType": "string",
    "icmpOptions": {
      "code": 0,
      "type": 0
    },
    "isStateless": true,
    "protocol": "string",
    "tcpOptions": {
      "destinationPortRange": {
        "max": 0,
        "min": 0
      },
      "sourcePortRange": {
        "max": 0,
        "min": 0
      }
    },
    "udpOptions": {
      "destinationPortRange": {
        "max": 0,
        "min": 0
      },
      "sourcePortRange": {
        "max": 0,
        "min": 0
      }
    }
  },
  {
    "destination": "string",
    "destinationType": "string",
    "icmpOptions": {
      "code": 0,
      "type": 0
    },
    "isStateless": true,
    "protocol": "string",
    "tcpOptions": {
      "destinationPortRange": {
        "max": 0,
        "min": 0
      },
      "sourcePortRange": {
        "max": 0,
        "min": 0
      }
    },
    "udpOptions": {
      "destinationPortRange": {
        "max": 0,
        "min": 0
      },
      "sourcePortRange": {
        "max": 0,
        "min": 0
      }
    }
  }
]
```