オブジェクト・ストレージのAmazon S3 Compatibility APIのサポート
Object StorageがAmazon S3 Compatibility APIをどのようにサポートしているかをご紹介します。
Amazon S3 Compatibility APIのサポートは、バケット・レベルおよびオブジェクト・レベルで提供されます。Amazon S3 Compatibility APIはバージョンIDをサポートしています。
バケットAPI
次のバケットAPIがサポートされています:
- DeleteBucket
- GetLocation
- HeadBucket
- GetService (すべてのバケットをリスト)
- ListObjects
- PutBucket
オブジェクトAPI
次のオブジェクトAPIがサポートされています:
マルチパート・アップロードAPI
次のマルチパート・アップロードAPIがサポートされています:
タグ付けAPI
次のタグ付けAPIがサポートされています:
SSE-Cのサポート
オプションのAPIヘッダーを使用すると、Object Storageとの間でアップロードおよびダウンロードされたオブジェクトの暗号化および暗号化に使用される独自の256ビットAES暗号化キーを指定できます。
サーバー側暗号化に独自のキーを使用するには、次の3つのリクエスト・ヘッダーを暗号化キー情報とともに指定します:
| ヘッダー | 説明 | サポートされるAPI |
|---|---|---|
x-amz-server-side-encryption-customer-algorithm
|
暗号化アルゴリズムとしてAES256を指定します。 | |
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を指定します。 | |
x-amz-copy-source-server-side-encryption-customer-key
|
ソース・オブジェクトの復号化に使用するbase64エンコードの256ビット暗号化キーを指定します。 | |
x-amz-copy-source-server-side-encryption-customer-key-md5
|
ソース・オブジェクトの復号化に使用する暗号化キーのbase64エンコードの128ビットMD5ダイジェストを指定します。 |
S3 SDKの作業
前述のSDKおよびツールの使用時にサポートされないAPI機能については、次の点に注意してください。
- AWS Signature Version 2 (SigV2)はサポートされていません。代わりに、AWS Signature Version 4署名メカニズムを使用してください。
ボールト内の独自のキーを使用した暗号化のサポート
オプションのAPIヘッダーを使用すると、Vault内の独自の暗号化キーを指定して、Object Storageにアップロードされたオブジェクトを暗号化できます。
サーバー側暗号化にVault内の独自のキーを使用するには、Vault内のキーのOCIDで次のリクエスト・ヘッダーを指定します:
| ヘッダー | 説明 | サポートされるAPI |
|---|---|---|
x-amz-server-side-encryption-aws-kms-key-id
|
オブジェクトの暗号化に使用されるボールト内の既存のキーのOCID。 |
aws-chunkedに対するContent-Encodingヘッダーのサポート
S3互換のクライアントは、Content-Encodingヘッダーのaws-chunkedを使用してオブジェクトをアップロードできます。単一パートのアップロードとマルチパートのUploadPartリクエストの両方がサポートされています。次のようなAWS SigV4ストリーミング・ペイロードがサポートされています。
STREAMING-AWS4-HMAC-SHA256-PAYLOADSTREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILERSTREAMING-UNSIGNED-PAYLOAD-TRAILER
クライアントは、HTTP Content-LengthまたはTransfer-Encoding: chunkedヘッダーを使用してaws-chunkedアップロードを送信できます。クライアントは、Amazon S3 Compatibility APIが実際のオブジェクトまたはパート・サイズとして扱うx-amz-decoded-content-lengthを提供する必要があります。チャンク署名が検証されるため、改ざんされたチャンク・データまたは無効なチャンク署名を含むアップロードは拒否されます。トレーラ署名は、署名付きトレーラ・モードのアップロードについて検証されるため、改ざんされたトレーラ・ブロックも拒否されます。トレーラ・チェックサム検証は次でサポートされています:
- CRC32
- CRC32C
- SHA256
- CRC64NVME
チェックサムの不一致により、リクエスト処理中にアップロードが失敗します。SHA256トレーラ・チェックサムは、既存のadditional-checksum動作と統合されるため、既存のAmazon S3 Compatibility APIチェックサム・セマンティクスと一貫して永続化できます。CRC32、CRC32C、およびCRC64NVMEトレーラチェックサムは検証専用であるため、検証は行われますが、オブジェクトメタデータとして保持されません。チャンク化されていないアップロードに対する既存のAmazon S3 Compatibility APIアップロード動作は変更されません。
S3 DeleteObjects / BulkDeleteのチェックサム・サポート
新しいバージョンのAWS SDKでは、Content-MD5ヘッダーは自動的に追加されず、かわりにデフォルトのチェックサムとして新しいヘッダー(x-amz-checksum-crc32など)に切り替えられます。Amazon S3 Compatibility APIのDeleteObjects/BulkDeleteフローでは、リクエスト本文を検証するためのContent-MD5の代替として、x-amz-checksum-sha256およびx-amz-checksum-crc32cがサポートされます。
MD5チェックサムとの下位互換性が必要な場合は、LegacyMd5Pluginを使用して、SDKによって以前のようにContent-MD5ヘッダーが追加されるようにします。
例:
S3Client s3Client = S3Client.builder()
.addPlugin(LegacyMd5Plugin.create())
.endpointOverride(URI.create(endpoint))
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKey, secretKey)))
.forcePathStyle(true)
.build();リクエストでchecksumAlgorithmを指定すると、LegacyMd5PluginはContent-MD5ヘッダーを省略します。
サポートされるAmazon S3クライアント
様々なクライアント・アプリケーションを構成して、オブジェクト・ストレージのAmazon S3互換エンドポイントと通信できます。このトピックでは、サポートされているAmazon S3クライアントの構成例をいくつか示します。
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)にあります。
オブジェクト・ストレージを使用するようにAWS SDK for Javascriptを構成する例を次に示します
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.names3fsを使用したオブジェクト・ストレージ・バケットのマウント
s3fsを使用すると、LinuxおよびmacOSでオブジェクト・ストレージをファイル・システムとしてマウントできます。s3fsのリポジトリ、ドキュメント・リンク、インストール手順および例は、GitHub (https://github.com/s3fs-fuse/s3fs-fuse)にあります。
s3fsは、すべてのアプリケーションに適しているわけではありません。次の制限事項を理解してください:
- オブジェクト・ストレージ・サービスは、ローカル・ファイル・システムと比較してレイテンシが長く、ランダムな書込みアクセス権がありません。s3fsは、大きいファイルのみを読み取るワークロードに対して最適なスループットを実現します。
- ファイルを部分的に更新することはできないため、1バイトを変更するだけでもファイル全体をアップロードする必要があります。
- ファイルへのランダムな書込みまたは追加を行うには、ファイル全体をリライトする必要があります。
- s3fsは部分的なダウンロードをサポートしていないため、ファイルの1バイトを読み取るだけの場合でも、ファイル全体をダウンロードする必要があります。
- s3fsは、サーバー側のファイル・コピーをサポートしていません。コピーしたファイルは、まずクライアントにダウンロードしてから、新しい場所にアップロードする必要があります。
- ディレクトリのリストなどのメタデータ操作の際には、ネットワーク・レイテンシによりパフォーマンスが低下します。
- s3fsは、ハード・リンクやファイルまたはディレクトリのアトミックな名前変更をサポートしていません。
- s3fsは、同じバケットをマウントする複数のクライアント間の調整を行いません。
オブジェクト・ストレージ・バケットをファイル・システムとしてマウントするには
オブジェクト・ストレージ・バケットのマウントのトラブルシューティングを行うには
- 認可エラーが発生した場合は、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>