リソース・プリンシパル・オーセンティケータ・プロバイダの作成

リソース・プリンシパルを使用してOCIリソースにアクセスするには、アプリケーションでリソース・プリンシパル・オーセンティケータ・プロバイダを使用できます。

次に、Javaアプリケーションのサンプル例を示します。

リソース・プリンシパル・オーセンティケータを作成してオブジェクト・ストレージに接続するサンプルJavaコード
import com.oracle.bmc.Region;
import com.oracle.bmc.auth.ResourcePrincipalAuthenticationDetailsProvider;
import com.oracle.bmc.objectstorage.ObjectStorage;
import com.oracle.bmc.objectstorage.ObjectStorageClient;
import com.oracle.bmc.objectstorage.model.CreateBucketDetails;
import com.oracle.bmc.objectstorage.requests.CreateBucketRequest;
import com.oracle.bmc.objectstorage.requests.GetBucketRequest;
import com.oracle.bmc.objectstorage.requests.GetBucketRequest.Fields;
import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest;
import com.oracle.bmc.objectstorage.requests.PutObjectRequest;
import com.oracle.bmc.objectstorage.responses.GetBucketResponse;
import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
 
/**
 * Example to get a bucket and its statistics.
 *
 * <p>This example first creates a bucket in the compartment corresponding to the compartment OCID
 * passed as the first argument to this program. The name of the bucket created is same as the
 * second argument to the program. It also creates an object in this bucket whose name is the third
 * argument. It then illustrates how we can get a bucket and its statistics (Estimated Size and
 * Estimated Count).
 *
 * Example program uses BDS resource principal to do auth, Make sure to set following env variables
 * before executing thr program
 *
 * <ul>
 *  <li>OCI_RESOURCE_PRINCIPAL_VERSION=2.2
 *  <li>OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM=/etc/security/tokens/rpst.pem
 *  <li>OCI_RESOURCE_PRINCIPAL_REGION=us-ashburn-1
 *  <li>OCI_RESOURCE_PRINCIPAL_RPST=/etc/security/tokens/rpst.token
 * </ul>
 *
 * Also ensure, the user who executes this program have access to above location
 *
 * @param args Arguments to provide to the example. The following arguments are expected:
 *     <ul>
 *       <li>The first argument is the OCID of the compartment.
 *       <li>The second is the name of bucket to create and later fetch
 *       <li>The third is the name of object to create inside bucket
 *     </ul>
 */
 
public class BdsListObjectExample {
    public static void main(String[] args) throws Exception {
 
        if (args.length != 3) {
            throw new IllegalArgumentException(
                    "Unexpected number of arguments received. Consult the script header comments for expected arguments");
        }
 
        ResourcePrincipalAuthenticationDetailsProvider provider = ResourcePrincipalAuthenticationDetailsProvider.builder().build();
 
        final String compartmentId = args[0];
        final String bucket = args[1];
        final String object = args[2];
 
        final Region region = Region.US_ASHBURN_1; //Can be updated based on the region where object is stored
 
        try(ObjectStorage objectStorageClient =
                    ObjectStorageClient.builder().region(region).build(provider)) {
 
            System.out.println("Getting the namespace.");
            GetNamespaceResponse namespaceResponse =
                    objectStorageClient.getNamespace(GetNamespaceRequest.builder().build());
            String namespaceName = namespaceResponse.getValue();
 
            System.out.println("Creating the source bucket.");
            CreateBucketDetails createSourceBucketDetails =
                    CreateBucketDetails.builder().compartmentId(compartmentId).name(bucket).build();
            CreateBucketRequest createSourceBucketRequest =
                    CreateBucketRequest.builder()
                            .namespaceName(namespaceName)
                            .createBucketDetails(createSourceBucketDetails)
                            .build();
            objectStorageClient.createBucket(createSourceBucketRequest);
 
            System.out.println("Creating the source object");
            PutObjectRequest putObjectRequest =
                    PutObjectRequest.builder()
                            .namespaceName(namespaceName)
                            .bucketName(bucket)
                            .objectName(object)
                            .contentLength(4L)
                            .putObjectBody(
                                    new ByteArrayInputStream("data".getBytes(StandardCharsets.UTF_8)))
                            .build();
            objectStorageClient.putObject(putObjectRequest);
 
            System.out.println("Creating Get bucket request");
            List<Fields> fieldsList = new ArrayList<>(2);
            fieldsList.add(GetBucketRequest.Fields.ApproximateCount);
            fieldsList.add(GetBucketRequest.Fields.ApproximateSize);
            GetBucketRequest request =
                    GetBucketRequest.builder()
                            .namespaceName(namespaceName)
                            .bucketName(bucket)
                            .fields(fieldsList)
                            .build();
 
            System.out.println("Fetching bucket details");
            GetBucketResponse response = objectStorageClient.getBucket(request);
 
            System.out.println("Bucket Name : " + response.getBucket().getName());
            System.out.println("Bucket Compartment : " + response.getBucket().getCompartmentId());
            System.out.println(
                    "The Approximate total number of objects within this bucket : "
                            + response.getBucket().getApproximateCount());
            System.out.println(
                    "The Approximate total size of objects within this bucket : "
                            + response.getBucket().getApproximateSize());
        }
    }
}
/**
Maven Dependencies. Version can be updated as per the requirement. This example is validated with version 3.43.0 of SDK
<dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-objectstorage</artifactId>
    <version>3.43.0</version>
</dependency>
<dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-common</artifactId>
    <version>3.43.0</version>
</dependency>
<dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-common-httpclient-jersey</artifactId>
    <version>3.43.0</version>
</dependency>
**/
ビッグ・データ・サービス・リソース・プリンシパルを使用してOCIボールトで様々な操作を行うためのサンプルPythonコード
# coding: utf-8
# Copyright (c) 2016, 2024, Oracle and/or its affiliates.  All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
 
import oci
import sys
from datetime import datetime
from datetime import timedelta
 
# ==========================================================
# Ensure to set the following env variable before running this code,
# OCI_RESOURCE_PRINCIPAL_VERSION=2.2
# OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM=/etc/security/tokens/rpst.pem
# OCI_RESOURCE_PRINCIPAL_REGION=us-ashburn-1
# OCI_RESOURCE_PRINCIPAL_RPST=/etc/security/tokens/rpst.token
#
# This file provides examples of basic key management service usage
# * - Get a vault
# * - Create a vault
# Management endpoint operations
# * - Get a key
# * - Create a key
# * - Enable a key
# * - Disable a key
# Secrets Management operations
# * - Create a secret
# * - Create a new secret version
# * - Update a secret
# * - Move a secret to a new compartment
# * - Delete a secret
# Documentation : https://docs.cloud.oracle.com/en-us/iaas/Content/KeyManagement/Tasks/managingsecrets.htm
 
# Usage : python secret_examples.py compartment_id
 
 
def create_vault(compartment_id, vault_name, sac_composite):
    print(" Creating vault {} in {} compartment.".format(vault_name,
                                                         compartment_id))
 
    # Create vault_details object that needs to be passed when creating vault.
    vault_details = oci.key_management.models.CreateVaultDetails(
        compartment_id=compartment_id,
        vault_type="DEFAULT",
        display_name=vault_name)
 
    print("Vault details {}.".format(vault_details.vault_type))
 
    # Since vault creation is asynchronous; we need to wait for the stream to become active.
    response = sac_composite.create_vault_and_wait_for_state(
        vault_details,
        wait_for_states=[oci.key_management.models.Vault.LIFECYCLE_STATE_ACTIVE])
    return response
 
 
def get_vault(client, vault_id):
    return client.get_vault(vault_id)
 
 
def create_key(key_mgmt_composite, key_name, compartment_id):
    print(" Creating key {} in compartment {}.".format(key_name, compartment_id))
 
    # Create key_details object that needs to be passed when creating key.
    key_shape = oci.key_management.models.KeyShape(algorithm="AES", length=32)
    key_details = oci.key_management.models.CreateKeyDetails(
        compartment_id=compartment_id,
        display_name=key_name,
        key_shape=key_shape)
 
    # Since key creation is asynchronous; we need to wait for the key to become enabled.
    response = key_mgmt_composite.create_key_and_wait_for_state(key_details,
                                                                wait_for_states=[
                                                                    oci.key_management.models.Key.LIFECYCLE_STATE_ENABLED])
    return response
 
 
def get_key(client, key_id):
    return client.get_key(key_id)
 
 
def enable_key(key_mgmt_composite, key_id):
    print(" Enabling key {}.".format(key_id))
 
    # Since enabling key is asynchronous; we need to wait for the key to become enabled.
    response = key_mgmt_composite.enable_key_and_wait_for_state(key_id,
                                                                wait_for_states=[
                                                                    oci.key_management.models.Key.LIFECYCLE_STATE_ENABLED])
    return response
 
 
def disable_key(key_mgmt_composite, key_id):
    print(" Disabling key {}.".format(key_id))
 
    # Since disabling key is asynchronous; we need to wait for the key to become disabled.
    response = key_mgmt_composite.disable_key_and_wait_for_state(key_id,
                                                                 wait_for_states=[
                                                                     oci.key_management.models.Key.LIFECYCLE_STATE_DISABLED])
    return response
 
 
def create_secret(vaults_client_composite, compartment_id, secret_content, secret_name, valult_id, key_id):
    print("Creating a secret {}.".format(secret_name))
 
    # Create secret_content_details that needs to be passed when creating secret.
    secret_description = "This is just a test"
    secret_content_details = oci.vault.models.Base64SecretContentDetails(
        content_type=oci.vault.models.SecretContentDetails.CONTENT_TYPE_BASE64,
        name=secret_content,
        stage="CURRENT",
        content=secret_content)
    secrets_details = oci.vault.models.CreateSecretDetails(compartment_id=compartment_id,
                                                           description=secret_description,
                                                           secret_content=secret_content_details,
                                                           secret_name=secret_name,
                                                           vault_id=vault_id,
                                                           key_id=key_id)
 
    # Create secret and wait for the secret to become active
    response = vaults_client_composite.create_secret_and_wait_for_state(create_secret_details=secrets_details,
                                                                        wait_for_states=[
                                                                            oci.vault.models.Secret.LIFECYCLE_STATE_ACTIVE])
    return response
 
 
def create_newsecret_version(vaults_client_composite, secret_content, secret_id):
    print("Creating a new secret version {}.".format(secret_id))
 
    # Create secret_content_details that needs to be passed when updating secret content.
    secret_content_details = oci.vault.models.Base64SecretContentDetails(
        content_type=oci.vault.models.SecretContentDetails.CONTENT_TYPE_BASE64,
        stage="CURRENT",
        content=secret_content)
 
    secrets_details = oci.vault.models.UpdateSecretDetails(secret_content=secret_content_details)
 
    # Create new secret version and wait for the new version to become active.
    response = vaults_client_composite.update_secret_and_wait_for_state(secret_id,
                                                                        secrets_details,
                                                                        wait_for_states=[
                                                                            oci.vault.models.Secret.LIFECYCLE_STATE_ACTIVE])
    return response
 
 
def get_secret(vaults_client, secret_id):
    return vaults_client.get_secret(secret_id)
 
 
def delete_secret(vaults_client, secret_id, deletion_time):
    print("Deleting a secret")
 
    # Create Secret deletion details object.
    secret_deletion_details = oci.vault.models.ScheduleSecretDeletionDetails(time_of_deletion=deletion_time)
    # secret_deletion_details = oci.vault.models.ScheduleSecretDeletionDetails()
 
    # Delete the secret or mark the secret for deletion
    response = vaults_client.schedule_secret_deletion(secret_id, secret_deletion_details)
    print("Secret deletion response is: {}.".format(response.data))
 
 
def delete_secret_version(vaults_client, secret_id, deletion_time, secret_version_number):
    print("Deleting a specific version of a secret")
 
    # Create Secret version deletion object
    secret_version_deletion_details = oci.vault.models.ScheduleSecretVersionDeletionDetails(time_of_deletion=deletion_time)
 
    # Delete the secret version or mark the version for deletion.
    response = vaults_client.schedule_secret_version_deletion(secret_id,
                                                              secret_version_number=secret_version_number,
                                                              schedule_secret_version_deletion_details=secret_version_deletion_details)
    print("Secret deletion response is: {}.".format(response.data))
 
 
def move_secret(vaults_client, secret_id, target_compartment_id):
    print("Moving secret to a target compartment")
 
    # Create an object of Change Secret Compartment Details
    target_compartment_details = oci.vault.models.ChangeSecretCompartmentDetails(compartment_id=target_compartment_id)
 
    # Move the secret to target compartment and then wait for the state to become active.
    response = vaults_client.change_secret_compartment(secret_id, change_secret_compartment_details=target_compartment_details)
    target_state = oci.vault.models.Secret.LIFECYCLE_STATE_ACTIVE.lower()
    try:
        waiter_result = oci.wait_until(
            vaults_client,
            vaults_client.get_secret(secret_id),
            evaluate_response=lambda r: getattr(r.data, 'lifecycle_state') and getattr(r.data, 'lifecycle_state').lower() == target_state,
            waiter_kwargs={}
        )
        result_to_return = waiter_result
        print("Change compartment response is {}.".format(result_to_return.data))
        return result_to_return
    except Exception as e:
        raise oci.exceptions.CompositeOperationError(partial_results=[response], cause=e)
 
 
if len(sys.argv) != 2:
    raise RuntimeError(
        'This example expects an ocid for the secret to read.')
 
compartment_id = sys.argv[1]
 
resource_principal_signer = oci.auth.signers.get_resource_principals_signer()
 
secret_content = "TestContent"
secret_name = "TestSecret"
VAULT_NAME = "KmsVault"
KEY_NAME = "KmsKey"
 
# Vault client to create vault
kms_vault_client = oci.key_management.KmsVaultClient({}, signer=resource_principal_signer)
kms_vault_client_composite = oci.key_management.KmsVaultClientCompositeOperations(
    kms_vault_client)
 
# This will create a vault in the given compartment
vault = create_vault(compartment_id, VAULT_NAME, kms_vault_client_composite).data
# vault = get_vault(kms_vault_client, vault_id).data
vault_id = vault.id
print(" Created vault {} with id : {}".format(VAULT_NAME, vault_id))
 
# Vault Management client to create a key
vault_management_client = oci.key_management.KmsManagementClient({}, signer=resource_principal_signer,
                                                                 service_endpoint=vault.management_endpoint)
vault_management_client_composite = oci.key_management.KmsManagementClientCompositeOperations(
    vault_management_client)
 
# Create key in given compartment
key = create_key(vault_management_client_composite, KEY_NAME, compartment_id).data
# key = get_key(vault_management_client,key_id).data
key_id = key.id
print(" Created key {} with id : {}".format(KEY_NAME, key.id))
 
# Vault client to manage secrets
vaults_client = oci.vault.VaultsClient({}, signer=resource_principal_signer)
vaults_management_client_composite = oci.vault.VaultsClientCompositeOperations(vaults_client)
 
secret = create_secret(vaults_management_client_composite, compartment_id, secret_content, secret_name, vault_id, key_id).data
secret_id = secret.id
print("Secret ID is {}.".format(secret_id))
 
secret_deletion_time = datetime.now() + timedelta(days=2)
delete_secret(vaults_client, secret_id, secret_deletion_time)

詳細は、oci-python-sdkの例を参照してください。

ビッグ・データ・サービス・リソース・プリンシパルを使用したオブジェクト・ストレージでのCURD操作のサンプルPython SDK
# coding: utf-8
# Copyright (c) 2016, 2024, Oracle and/or its affiliates.  All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
 
# Ensure to set the following env variable before running this code,
# OCI_RESOURCE_PRINCIPAL_VERSION=2.2
# OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM=/etc/security/tokens/rpst.pem
# OCI_RESOURCE_PRINCIPAL_REGION=us-ashburn-1
# OCI_RESOURCE_PRINCIPAL_RPST=/etc/security/tokens/rpst.token
 
 
import filecmp
from datetime import datetime, timedelta
 
import pytz
 
import oci
from oci._vendor import urllib3
from oci.object_storage.models import CreateBucketDetails
from oci.object_storage.models import CreatePreauthenticatedRequestDetails
 
resource_principal_signer = oci.auth.signers.get_resource_principals_signer()
compartment_id = "<<compartment_ocid>>"
object_storage = oci.object_storage.ObjectStorageClient({}, signer=resource_principal_signer)
 
namespace = object_storage.get_namespace().data
bucket_name = "python-sdk-example-bucket"
object_name = "python-sdk-example-object"
my_data = b"Hello, World!"
par_name = "python-sdk-example-par"
 
print("Creating a new bucket {!r} in compartment {!r}".format(
    bucket_name, compartment_id))
request = CreateBucketDetails()
request.compartment_id = compartment_id
request.name = bucket_name
bucket = object_storage.create_bucket(namespace, request)
 
print("Uploading new object {!r}".format(object_name))
obj = object_storage.put_object(
    namespace,
    bucket_name,
    object_name,
    my_data)
 
same_obj = object_storage.get_object(
    namespace,
    bucket_name,
    object_name)
 
print("{!r} == {!r}: {}".format(
    my_data, same_obj.data.content,
    my_data == same_obj.data.content))
 
print('Uploading a file to object storage')
 
# First create a sample file
sample_content = b'a' * 1024 * 1024 * 5
with open('example_file', 'wb') as f:
    f.write(sample_content)
 
# Then upload the file to Object Storage
example_file_object_name = 'example_file_obj'
with open('example_file', 'rb') as f:
    obj = object_storage.put_object(namespace, bucket_name, example_file_object_name, f)
 
# Retrieve the file, streaming it into another file in 1 MiB chunks
print('Retrieving file from object storage')
get_obj = object_storage.get_object(namespace, bucket_name, example_file_object_name)
with open('example_file_retrieved', 'wb') as f:
    for chunk in get_obj.data.raw.stream(1024 * 1024, decode_content=False):
        f.write(chunk)
 
print('Uploaded and downloaded files are the same: {}'.format(filecmp.cmp('example_file', 'example_file_retrieved')))
 
# Creating a Pre-Authenticated Request
par_ttl = (datetime.utcnow() + timedelta(hours=24)).replace(tzinfo=pytz.UTC)
 
create_par_details = CreatePreauthenticatedRequestDetails()
create_par_details.name = par_name
create_par_details.object_name = object_name
create_par_details.access_type = CreatePreauthenticatedRequestDetails.ACCESS_TYPE_OBJECT_READ
create_par_details.time_expires = par_ttl.isoformat()
 
par = object_storage.create_preauthenticated_request(namespace_name=namespace, bucket_name=bucket_name,
                                                     create_preauthenticated_request_details=create_par_details)
 
# Get Object using the Pre-Authenticated Request
par_request_url = object_storage.base_client.get_endpoint() + par.data.access_uri
 
http = urllib3.PoolManager()
par_obj = http.request('GET', par_request_url).data.decode('utf-8')
print("Check object from PAR is same or not: {}".format(my_data == bytes(par_obj, 'utf-8')))
 
# Delete Pre-Authenticated Request
object_storage.delete_preauthenticated_request(namespace_name=namespace, bucket_name=bucket_name, par_id=par.data.id)
 
print("Deleting object {}".format(object_name))
object_storage.delete_object(namespace, bucket_name, object_name)
 
print("Deleting object {}".format(example_file_object_name))
object_storage.delete_object(namespace, bucket_name, example_file_object_name)
 
print("Deleting bucket {}".format(bucket_name))
object_storage.delete_bucket(namespace, bucket_name)

詳細は、object_crud.pt Exampleを参照してください。