🗂

OCI PythonSDKをインストールしてPARを取得するまでやってみる

2022/06/02に公開約5,000字

OCI PythonSDKをインストールしてPARを取得してみました。
※PARとはPreAuthenticationRequestの略です。事前認証リクエストURLですね。
※PythonSDKのバージョンはv2.70.0です。

驚きの事実

1年前までoci-curlでREST APIを実行しており、もう一度設定しようとページを探したのですが、見つからずサポートに問い合わせるとoci-curlはサポートされなくなったと言われてしまいました・・・

PythonSDKの環境構築

前提条件

  • OCI CLIがインストールされている
  • Python3系がインストールされている
$ pip3 -V
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
$ python3 -V
Python 3.8.10
$ oci --version
3.9.0
s-kaneko@S19076:~$

インストーラをダウンロードします。

wget https://github.com/oracle/oci-python-sdk/releases/download/v2.70.0/oci-python-sdk-2.70.0.zip

解凍し階層移動します

unzip oci-python-sdk-2.70.0.zip
cd oci-python-sdk/

PytonSDKをpipインストール

pip3 install oci-2.70.0-py2.py3-none-any.whl

PythonSDKを使ってPARの作成

基本となるコード

こちらのコードはオラクルのドキュメントに記載されています。

# This is an automatically generated code sample.
# To make this code sample work in your Oracle Cloud tenancy,
# please replace the values for any parameters whose current values do not fit
# your use case (such as resource IDs, strings containing ‘EXAMPLE’ or ‘unique_id’, and
# boolean, number, and enum parameters with values not fitting your use case).

import oci
from datetime import datetime

# Create a default config using DEFAULT profile in default location
# Refer to
# https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File
# for more info
config = oci.config.from_file()


# Initialize service client with default config file
object_storage_client = oci.object_storage.ObjectStorageClient(config)


# Send the request to service, some parameters are not required, see API
# doc for more info
create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
    namespace_name="EXAMPLE-namespaceName-Value",
    bucket_name="EXAMPLE-bucketName-Value",
    create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
        name="EXAMPLE-name-Value",
        access_type="AnyObjectWrite",
        time_expires=datetime.strptime(
            "2007-03-21T15:52:36.708Z",
            "%Y-%m-%dT%H:%M:%S.%fZ"),
        bucket_listing_action="Deny",
        object_name="EXAMPLE-objectName-Value"),
    opc_client_request_id="ocid1.test.oc1..<unique_ID>EXAMPLE-opcClientRequestId-Value")

# Get the data from response
print(create_preauthenticated_request_response.data)

ちょこっとコードを修正

私の場合「opc_client_request_id」

object_storage_client.create_preauthenticated_request(
    namespace_name="*********", #バケットのネームスペース
    bucket_name="*********", #PARを発行するバケットの名前を指定
    create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
        name="test_bucket", #PARに付ける名前なんでもOK
        access_type="AnyObjectWrite", #バケットorオブジェクトに対する権限設定
        time_expires=datetime.strptime( #PARの有効期限を指定
            "2007-03-21T15:52:36.708Z",
            "%Y-%m-%dT%H:%M:%S.%fZ"),
        bucket_listing_action="Deny", #バケット内部のファイルのリスト参照を禁止
        object_name="********"), 接頭辞付きURLにする場合の設定
    opc_client_request_id="ocid1.test.oc1..<unique_ID>EXAMPLE-opcClientRequestId-Value")

実行してみる

$ python3 oci_python_sdk.py
{
  "access_type": "AnyObjectWrite",
  "access_uri": "/p/E*************G10Tn/n/***********/b/*******/o/",
  "bucket_listing_action": "Deny",
  "id": "T8LNbvBhpzXN********************IjFOGS5DRjZqzns",
  "name": "par",
  "object_name": "object",
  "time_created": "2022-06-02T01:07:42.695000+00:00",
  "time_expires": "2022-06-04T15:52:36.708000+00:00"
}
$


OCIコンソールで確認して分かったのですが、このコードだと「接頭辞付きURL」になっています。

バケット単位のPARを作成してみる

object_nameをコメントアウトします

create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
        name="par",
        access_type="AnyObjectWrite",
        time_expires=datetime.strptime(
            "2022-06-4T15:52:36.708Z",
            "%Y-%m-%dT%H:%M:%S.%fZ"),
        bucket_listing_action="Deny",
        #object_name="object"
        ),
        )

オブジェクト単位のPARを作成してみる

access_typeを「ObjectWrite」に変更します。

create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
        name="par",
        access_type="ObjectWrite",
        time_expires=datetime.strptime(
            "2022-06-4T15:52:36.708Z",
            "%Y-%m-%dT%H:%M:%S.%fZ"),
        bucket_listing_action="Deny",
        object_name="object"
        ),
        )

最後に

セキュリティが気になる方は「accessType」を活用されることをお勧めします。
accessTypeのパラメータ

  • ObjectRead
  • ObjectWrite
  • ObjectReadWrite
  • AnyObjectWrite
  • AnyObjectRead
  • AnyObjectReadWrite

Discussion

ログインするとコメントできます