オブジェクト・ストレージ Amazon S3 Compatibility APIのサポート

オブジェクト・ストレージAmazon S3 Compatibility APIをどのようにサポートするかについて学習します。

Amazon S3 Compatibility APIのサポートは、バケット・レベルおよびオブジェクト・レベルで提供されます。Amazon S3 Compatibility APIでは、バージョンIDがサポートされています。

バケットAPI

次のバケットAPIがサポートされています:

オブジェクトAPI

次のオブジェクトAPIがサポートされています:

マルチパート・アップロードAPI

次のマルチパート・アップロードAPIがサポートされています:

タグ付けAPI

次のタグ付けAPIがサポートされています:

SSE-Cのサポート

オプションのAPIヘッダーを使用すると、オブジェクト・ストレージとの間でアップロードおよびダウンロードされたオブジェクトの暗号化および暗号化に使用される独自の256ビットAES暗号化キーを指定できます。

サーバー側暗号化に独自のキーを使用するには、次の3つのリクエスト・ヘッダーを暗号化キー情報とともに指定します:

ヘッダー 説明 サポートされるAPI
x-amz-server-side-encryption-customer-algorithm 暗号化アルゴリズムとしてAES256を指定します。

GetObject

HeadObject

PutObject

InitiateMultipartUpload

UploadPart

x-amz-server-side-encryption-customer-key データの暗号化または復号化に使用するbase64エンコードの256ビット暗号化キーを指定します。
x-amz-server-side-encryption-customer-key-md5 暗号化キーのbase64エンコードの128ビットMD5ダイジェストを指定します。この値は、暗号化キーの整合性チェックに使用されます。

オブジェクト・ストレージには、オブジェクトやパートをコピーするための別個のAPIがあります。Amazon S3は、PutObjectおよびUploadPartに次のヘッダーが存在することを使用して、コピー操作を決定します。SSE-Cキーで暗号化されたソース・オブジェクトをコピーするには、オブジェクト・ストレージがオブジェクトを暗号化できるように、これら3つのヘッダーを指定する必要があります。

ヘッダー 説明 サポートされるAPI
x-amz-copy-source-server-side-encryption-customer-algorithm ソース・オブジェクトの復号化に使用する暗号化アルゴリズムとしてAES256を指定します。

PutObject

UploadPart

x-amz-copy-source-server-side-encryption-customer-key ソース・オブジェクトの復号化に使用するbase64エンコードの256ビット暗号化キーを指定します。
x-amz-copy-source-server-side-encryption-customer-key-md5 ソース・オブジェクトの復号化に使用する暗号化キーのbase64エンコードの128ビットMD5ダイジェストを指定します。

Vault内の独自のキーを使用した暗号化のサポート

オプションのAPIヘッダーを使用すると、Vault内の独自の暗号化キーを指定して、オブジェクト・ストレージにアップロードされたオブジェクトを暗号化できます。

サーバー側暗号化にVault内の独自のキーを使用するには、Vault内のキーのOCIDで次のリクエスト・ヘッダーを指定します:

ヘッダー 説明 サポートされるAPI
x-amz-server-side-encryption-aws-kms-key-id オブジェクトの暗号化に使用されるVault内の既存のキーのOCID。

PutObject

InitiateMultipartUpload

UploadPart

サポートされるAmazon S3クライアント

様々なクライアント・アプリケーションを構成して、オブジェクト・ストレージのAmazon S3互換エンドポイントと通信できます。このトピックでは、サポートされているAmazon S3クライアントの構成例をいくつか示します。Amazon S3 Compatibility APIの前提条件を確認してください。

AWS SDK for Java

AWS SDK for Javaのリポジトリ、ファイルのダウンロードおよびドキュメントのリンクは、GitHub (https://github.com/aws/aws-sdk-java)にあります。

オブジェクト・ストレージを使用するようにAWS SDK for Javaを構成する例を次に示します。


                // Put the Access Key and Secret Key here
                
AWSCredentialsProvider credentials = new AWSStaticCredentialsProvider(new BasicAWSCredentials(
 "gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID",
 "7fa22331ebe62bf4605dc9a42aaeexampleuniqueID"))));

// Your namespace
String namespace = "namespace";

// The region to connect to
String region = "us-ashburn-1";

// Create an S3 client pointing at the region
String endpoint = String.format("%s.compat.objectstorage.%s.oraclecloud.com",namespace,region);
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endpoint, region);
AmazonS3 client = AmazonS3Client.builder()
 .standard()
 .withCredentials(credentials)
 .withEndpointConfiguration(endpointConfiguration)
 .disableChunkedEncoding()
 .enablePathStyleAccess()
 .build();

AWS SDK for Javascript

AWS SDK for Javascriptのリポジトリ、ドキュメント・リンクおよびインストール手順は、GitHub (https://github.com/aws/aws-sdk-js)にあります。

オブジェクト・ストレージを使用するようにJavascript用のAWS SDKを構成する例を次に示します

s3 = new AWS.S3({
  region: 'us-ashburn-1',
  endpoint: 'https://' + mynamespace + '.compat.objectstorage.us-ashburn-1.oraclecloud.com',
  accessKeyId: 'gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID',
  secretAccessKey: '7fa22331ebe62bf4605dc9a42aaeexampleuniqueID',
  s3ForcePathStyle: true,
  signatureVersion: 'v4',
});

AWS SDK for Python (Boto3)

AWS SDK for Python (Boto3)のリポジトリ、ドキュメント・リンクおよびインストール手順は、GitHub (https://github.com/boto/boto3)にあります。

オブジェクト・ストレージを使用するようにAWS SDK for Pythonを構成する例を次に示します

import boto3
  
s3 = boto3.resource(
    's3',
    aws_access_key_id="gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID",
    aws_secret_access_key="7fa22331ebe62bf4605dc9a42aaeexampleuniqueID",
    region_name="us-phoenix-1", # Region name here that matches the endpoint
    endpoint_url="https://mynamespace.compat.objectstorage.us-phoenix-1.oraclecloud.com" # Include your namespace in the URL
)
  
# Print out the bucket names
for bucket in s3.buckets.all():
    print bucket.name

s3fsを使用したオブジェクト・ストレージ・・バケットのマウント

s3fsを使用すると、LinuxおよびmacOSでオブジェクト・ストレージをファイル・システムとしてマウントできます。s3fsのリポジトリ、ドキュメント・リンク、インストール手順および例は、GitHub (https://github.com/s3fs-fuse/s3fs-fuse)にあります。

s3fsは、すべてのアプリケーションに適しているわけではありません。次の制限事項を理解してください:

  • オブジェクト・ストレージ・サービスは、ローカル・ファイル・システムと比較してレイテンシが長く、ランダムな書込みアクセス権がありません。s3fsは、大きいファイルのみを読み取るワークロードに対して最適なスループットを実現します。

  • ファイルを部分的に更新することはできないため、1バイトを変更するだけでもファイル全体をアップロードする必要があります。

  • ファイルへのランダムな書込みまたは追加を行うには、ファイル全体をリライトする必要があります。

  • s3fsは部分的なダウンロードをサポートしていないため、ファイルの1バイトを読み取るだけの場合でも、ファイル全体をダウンロードする必要があります。

  • s3fsは、サーバー側のファイル・コピーをサポートしていません。コピーしたファイルは、まずクライアントにダウンロードしてから、新しい場所にアップロードする必要があります。

  • ディレクトリのリストなどのメタデータ操作の際には、ネットワーク・レイテンシによりパフォーマンスが低下します。

  • s3fsは、ハード・リンクやファイルまたはディレクトリのアトミックな名前変更をサポートしていません。

  • s3fsは、同じバケットをマウントする複数のクライアント間の調整を行いません。

オブジェクト・ストレージ・バケットをファイル・システムとしてマウントするには

  1. GitHub (https://github.com/s3fs-fuse/s3fs-fuse)にあるインストール手順に従います。

    事前構築済パッケージを使用してインストールできない場合は、https://github.com/s3fs-fuse/s3fs-fuse/blob/master/COMPILATION.mdのコンパイル手順に従ってください。

  2. Amazon S3 Compatibility APIの前提条件を確認して実行します。バケットをファイル・システムとしてマウントできるアクセス・キー/秘密キーのペアと適切なIAMポリシーが必要です。例:
    Allow group s3fsAdmins to manage object-family in compartment MyCompartment
  3. ${HOME}/.passwd-s3fs資格証明ファイルに、アクセス・キー/秘密キーのペアの資格証明を入力します:
    cat ${HOME}/.passwd-s3fs
    access_key:secret_key

    例:

    cat ${HOME}/.passwd-s3fs
    gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID:7fa22331ebe62bf4605dc9a42aaeexampleuniqueID

    次に、資格証明ファイルの所有者のみの権限を設定します:

    chmod 600 ${HOME}/.passwd-s3fs
  4. オブジェクト・ストレージ・バケットをマウントするマウント・ポイントを作成します:
    mkdir /path/to/<local_directory_name>
    s3fs bucket_name local_directory_name -o passwd_file=${HOME}/.passwd-s3fs -o url=https://<namespace_name>.compat.objectstorage.<region_ID>.oraclecloud.com -o use_path_request_style -o kernel_cache -o multipart_size=128 -o parallel_count=50 -o multireq_max=100 -o max_background=1000 [-o endpoint=<region_ID>]

    説明:

    • bucket_nameは、マウントするバケットの名前です。
    • local_directory_nameは、バケットをマウントするローカル・ディレクトリの名前です。
    • namespace_nameは、アカウントの作成時にテナンシに割り当てられた一意のシステム生成です。CLIまたはコンソールを使用して、ネームスペース名を取得できます。詳細は、オブジェクト・ストレージ・ネームスペースを参照してください。
    • region_IDは、バケットが存在するリージョン識別子です。詳細は、リージョンおよび可用性ドメインを参照してください。
    • endpoint: ホーム・リージョンで作成されたバケットをマウントする場合は、endpointパラメータを指定する必要はありません。別のリージョンで作成されたバケットをマウントする場合は、endpointパラメータを指定する必要があります。
  5. s3fsを使用してシステム起動時にバケットをファイル・システムとして自動的にマウントするには、/etc/fstabファイルに次を追加します:

    bucket_name /path/to/local_directory_name fuse.s3fs use_path_request_style,passwd_file=/root/.s3fs-password,url=https://namespace_name.compat.objectstorage.region_ID.oraclecloud.com,endpoint=region_ID kernel_cache,multipart_size=128,parallel_count=50,multireq_max=100,max_background=1000,_netdev
  6. s3fsバケットのマウントを確認するには、df -hコマンドを実行します。出力には、バケットの新しいマウント・ポイントが表示されます。新しいマウント・ポイントに移動し、lsコマンドを実行してバケット内のすべてのオブジェクトをリストします。

オブジェクト・ストレージ・バケットのマウントのトラブルシューティングを行うには

  • 認可エラーが発生した場合は、IAMポリシーをレビューし、バケットをファイル・システムとしてマウントできるポリシーがあることを確認します。例:
    Allow group s3fsAdmins to manage object-family in compartment MyCompartment
  • s3fsコマンドのURLで正しいネームスペース名を使用していることを確認します。ネームスペース名を確認するには、オブジェクト・ストレージ・ネームスペースを参照してください。
  • マウントしようとしている名前付きバケットが存在し、アクセス権があるコンパートメントにあることを確認します。次のいずれかの方法を使用して、バケット名を確認します:
    • コンソールにログインし、アクセス権があるコンパートメントで名前付きバケットを見つけます。
    • CLIコマンドoci os bucket list --namespace <object_storage_namespace> --compartment-id <target_compartment_id>を使用します。
  • ホーム・リージョン以外のリージョンで作成されたバケットをマウントするには、urlパラメータとendpointパラメータの両方にそのリージョンを指定する必要があります。
  • バケットをルート・ユーザーとしてマウントした場合、-o allow_otherをs3fsコマンドに追加するか、allow_other/etc/fstabマウント・オプションに追加しないかぎり、他のユーザーはバケット内のオブジェクトをリストまたはアクセスできません。特定のUIDおよびGIDパラメータを指定して、ユーザー・アクセスの詳細を指定することもできます。
  • トラブルシューティング・ソリューションを確認して検証した上で、サポートに連絡する必要がある場合は、DEBUGモードでmountコマンドを再度実行して、障害の詳細を取得します。コマンドの最後に次を追加して、出力を保存します:

    -o dbglevel=info -f -o curldbg

ファイル・システムからオブジェクト・ストレージ・バケットをアンマウントするには

マウント・ポイントを指定して次のコマンドを実行します:
umount /path/to/<local_directory_name>