· 

Oracle Cloud Infrastructure (OCI) のAPI実行方法

こんにちは。Y.Tです。

今回はOracle Cloud Infrastructure (OCI) のAPI呼び出しの方法についてまとめたいと思います!

OCI APIは、HTTPSリクエスト、およびレスポンスを利用するREST APIです。

APIを利用することで、例えば、OCI上のデータベース内に保存したデータを取り出し、分析し、外部のデバイスで

アクションを実行することなどができます

 

OCIのAPIを利用する手順は以下になります。

 

1. API利用準備

 1-1. API実行ユーザの作成

 1-2. APIキーの作成

 1-3. APIを利用するために必要な情報

 1-4.取得したい情報のパスの確認(APIドキュメントで確認)

2. APIでデータ取得

 2-1. curlで取得

 2-2. oci-curlコマンドを作成して取得

1. API利用準備

1-1. API実行ユーザの作成

・OCI上にユーザーを作成

まずはOCI上にAPI呼び出し用のユーザを作成します。

OCIのユーザは以下の2種類あります。

 ・IDCSユーザ:Oracle Cloudだけでなく、BlockchainやJava cloudなどのアカウントとして統合的に利用可能

 ・IAMユーザ:Oracle Cloudのみ利用可能

 

ログイン画面は以下のように分かれています。

APIの呼び出し権限が付与されているユーザであれば、どちらのユーザでもAPI呼び出しが利用可能です。

 

1-2. APIキーの作成

※2021/1/8追記

2020/11/30から、OCIのWebコンソールでAPIキーが生成できるようになりました!

アイデンティティ -> ユーザ から、APIを利用するユーザを選択します。「APIキーの追加」をクリックすると以下の

画面が表示され、秘密鍵がインストールできるようになっています。また、「追加」をクリックすると、公開鍵が
ユーザのAPIキーに追加されます。

 

APIキーの利用にあたり、PEM形式のRSAキーペアが必要になります。

キーペアは以下のコマンドで作成可能です。

 

1. 鍵を保存するディレクトの作成

$mkdir ~/.oci

2. パスフレーズ無しで秘密鍵の作成

$openssl genrsa -out ~/.oci/oci_api_key.pem 2048

3. 権限の設定

$chmod go-rwx ~/.oci/oci_api_key.pem

4. 公開鍵の作成

$openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem

 

次にAPIを呼び出す端末とAPIを呼び出すOCIのユーザに公開鍵をアップロードします。

公開鍵をアップロード後には、フィンガープリントが表示されます。

アイデンティティ -> ユーザ

1-3. APIを利用するために必要な情報

APIを呼び出す際には、ユーザのOCID、フィンガープリント、テナンシのOCIDの確認が必要になります。

※取得対象のデータによっては、上記以外のOCIDも必要になります

 

・ユーザのOCID、フィンガープリントの確認方法

 アイデンティティ -> ユーザ

・テナンシーのOCIDの確認方法

 右上アイコンプロファイル -> テナンシ

1-4. 取得したい情報のパスの確認(APIドキュメントで確認)

OCIのAPIドキュメントは公開されています。

Oracle Cloud Infrastructure Documentation 

ここで、取得したいデータのエンドポイントなどパスを確認します。 

 

・APIエンドポイントの確認

例えば、OCIのIAMアカウントのポリシーを確認したい場合、APIドキュメントで

「Identity and Access Management Service API」を選択します。

APIエンドポイントは「API Endpoints」に記載されている「https://identity.ap-tokyo-1.oraclecloud.com」に

なります。

・APIリクエストパスの確認

ポリシーを確認したいため、「Identity and Access Management Service API」内の「Policy」から

「GetPolicy」を選択します。

API リクエストパスは「/20160918/policies/{policyId}」になります。

※{policyId}にはOCI上でアイデンティティ -> ポリシー 内「ポリシー情報」に記載されているOCIDを指定します

2. APIでデータ取得

OCIのAPI利用方法は、curlで利用する方法とoci-curlコマンドを利用する方法の2種類あります。

curlが利用可能なマシンからそのままAPI実行が可能ですが、APIリクエスト文が長くなるため、

API自体の利用が面倒です。

対して、oci-curlコマンドは、コマンド作成のためのシェルスクリプトを別途配置する必要があり、

利用するための準備は少し面倒ですが、APIリクエスト文の指定が簡単にできます!

ここでは、2種類の方法どちらもご紹介したいと思います。

2-1. curlで利用

OCIのAPIリクエストをするcurl文は以下になります。

curl -v -X GET -sS https://<API エンドポイント><API リクエストパス>\

 -H <現在の日時>\

 -H "Authorization: Signature \

version=\"1\"\

,keyId=\"<テナンシーOCID>/<ユーザOCID>/<フィンガープリント>\"\

,algorithm=\"rsa-sha256\"\

,headers=\"(request-target) date host\"\

,signature=\"<署名文字列>\""

<API エンドポイント><API リクエストパス>:1-4で確認した取得したいデータのパスを記載します

<現在の日時>:以下に記載する署名文字列作成時に利用した形式を記載します

<テナンシーOCID>、<ユーザOCID>、<フィンガープリント>1-3で確認した各種OCIDを指定します

<署名文字列>:署名文字列は以下のように作成します

~署名文字列の作成方法~

curlでAPIを利用する際は、署名文字列が必要になります。

※oci-curlコマンドを作成する場合、コマンドのスクリプト内で自動で作成されます

署名文字列は以下のコマンドの実行結果を指定します。

printf "(request-target): get <API リクエストパス>\n

date: <現在の日時>\nhost: <API エンドポイント>"

| openssl dgst -sha256 -sign <秘密鍵を保存したパス>

| openssl enc -e -base64 

| tr -d ‘\n'

<API リクエストパス>:1-4で確認した取得したいデータのパスを記載します

・<API エンドポイント>:1-4で確認した取得したいデータのパスを記載します

<現在の日時>:以下のコマンドを実行し、取得した値を指定

date -u "+%a, %d %h %Y %H:%M:%S GMT“

パスワードポリシー取得API実行結果例)

{

  “compartmentId”: “<テナンシーOCID>",

  "passwordPolicy": {

    "minimumPasswordLength": 8,

    "isUppercaseCharactersRequired": true,

    "isLowercaseCharactersRequired": true,

    "isNumericCharactersRequired": true,

    "isSpecialCharactersRequired": true,

    "isUsernameContainmentAllowed": false,

    "isPasswordResetEnabled": true

  },

  "networkPolicy": {}

 

}

2-2. oci-curlコマンドを作成して取得

署名文字列の作成や各種OCIDの指定を、あらかじめoci-curlコマンドとしてシェルスクリプトを保存し、

実行することも可能です。

1. oci-curlコマンドのシェルスクリプト配置・編集

oci-curlコマンドのシェルスクリプト

# TODO: update these values to your own

local tenancyId="<テナンシーOCID>";

local authUserId="<ユーザOCID>";

local keyFingerprint="<フィンガープリント>";

local privateKeyPath="<秘密鍵のパス>";

 

2. oci-curlコマンドにパスを通す

 ln -si <oci-curlコマンド保存パス> /usr/local/bin

 

3. 以下のコマンドで実行

ocicurl <API Endpoints> get "<Request>"

 

以上が実行方法になります。

 

最後までお読みいただき、ありがとうございました!