すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:Amazon S3 SDKを使用したOSSへのアクセス

最終更新日:Dec 09, 2024

Object Storage Service (OSS) は、Amazon Simple Storage Service (Amazon S3) と互換性のあるAPI操作を提供します。 Amazon S3からOSSにデータを移行した後、簡単な設定を使用して、クライアントアプリケーションをOSSと互換性のあるものにすることができます。 このトピックでは、さまざまな開発プラットフォームでAmazon S3 SDKを使用して構成を初期化し、Amazon S3 SDK API操作を使用してOSSリソースにアクセスする方法について説明します。

前提条件

  • RAMユーザーが作成され、AccessKeyペアが取得されます。 詳細については、「RAM ユーザーの作成」をご参照ください。

  • システム権限またはカスタム権限がRAMユーザーに付与されます。

    • システム権限

      AliyunOSSFullAccessポリシーまたはAliyunOSSReadOnlyAccessポリシーをRAMユーザーにアタッチできます。

    • カスタム権限

      カスタムRAMポリシーをRAMユーザーにアタッチして、ビジネスシナリオに基づいてきめ細かいOSS権限制御を実装できます。 詳細については、「RAMポリシーの一般的な例」をご参照ください。

  • Amazon S3 SDKを統合するクライアントアプリケーションが作成され、期待どおりに実行されます。

制限事項

Amazon S3 SDKを使用してOSSバケットにアクセスできるのは、Amazon S3 SDKと互換性のあるパブリックエンドポイントと内部エンドポイントのみです。

背景情報

この例では、中国 (香港) リージョンが使用されています。 S3-compatibleのパブリックエンドポイントがs3.oss-cn-hongkong.aliyuncs.comされ、S3-compatibleの内部エンドポイントがs3.oss-cn-hongkong-internal.aliyuncs.comされます。 別のリージョンのエンドポイントを使用する場合は、エンドポイントのリージョンIDを置き換えます。 リージョンとそのエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

Amazon S3 SDK for Java

  • バージョン1.x

    次の例では、Amazon S3 SDK for Java 1.11.609が使用されています。 次のサンプルコードでは、s3Clientインスタンスを初期化する方法の例を示します。

    • コードから一時的なアクセス資格情報を読み取ってs3Clientインスタンスを初期化する

      // Specify environment variables to pass temporary access credentials. 
              String accessKeyId = System.getenv().get("OSS_AccessKeyId");;
              String accessKeySecret = System.getenv().get("OSS_AccessKeySecret");;
              String sessionToken = System.getenv().get("OSS_SessionToken");;
              AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                      .withCredentials(new AWSStaticCredentialsProvider(new BasicSessionCredentials(accessKeyId, accessKeySecret, sessionToken)))
                      .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
                              "https://oss-cn-hongkong.aliyuncs.com",
                              ""))
                      .withPathStyleAccessEnabled(false)
                      .withChunkedEncodingDisabled(true)
                      .build();
    • 設定ファイルから一時的なアクセス資格情報を読み取ってs3Clientインスタンスを初期化する

      1. 設定ファイルの一時的なアクセス資格情報を ~/.aws/credentialsで設定します。

        [default]
        aws_access_key_id = [OSS_AccessKeyId]
        aws_secret_access_key = [OSS_AccessKeySecret]
        aws_secret_sessiontoken = [OSS_SessionToken]
      2. s3Clientインスタンスを初期化します。

        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
                        "https://oss-cn-hongkong.aliyuncs.com",
                        ""))
                .withPathStyleAccessEnabled(false)
                .withChunkedEncodingDisabled(true)
                .build();
  • バージョン2.x

    次の例では、Amazon S3 SDK for Java 2.17.201が使用されています。 次のサンプルコードは、s3Clientインスタンスを初期化する方法の例を示しています。

    // Specify environment variables to pass temporary access credentials. 
            String accessKeyId = System.getenv().get("OSS_AccessKeyId");;
            String accessKeySecret = System.getenv().get("OSS_AccessKeySecret");;
            String sessionToken = System.getenv().get("OSS_SessionToken");;
            S3Client s3 = S3Client.builder()
                    .credentialsProvider(StaticCredentialsProvider.create(AwsSessionCredentials.create(accessKeyId, accessKeySecret, sessionToken)))
                    .region(Region.AWS_GLOBAL)
                    .endpointOverride(URI.create("http://s3.oss-us-west-1.aliyuncs.com"))
                    .serviceConfiguration(S3Configuration.builder()
                            .pathStyleAccessEnabled(false)
                            .chunkedEncodingEnabled(false)
                            .build())
                    .build();

Python SDK

次の例では、Amazon S3 SDK for Python 1.9.205が使用されています。 次のサンプルコードは、s3Clientインスタンスを初期化する方法の例を示しています。

import boto3
import os
from botocore.config import Config

endpoint = 'https://oss-cn-hongkong.aliyuncs.com'
# Specify environment variables to pass temporary access credentials. 
access_key_id = os.getenv('OSS_AccessKeyId')
secret_access_key = os.getenv('OSS_AccessKeySecret')
session_token = os.getenv('OSS_SessionToken')

s3 = boto3.client(
    's3',
    aws_access_key_id=access_key_id,
    aws_secret_access_key=secret_access_key,
    aws_session_token=session_token,
    endpoint_url=endpoint,
    config=Config(s3={"addressing_style": "virtual"},
                      signature_version='v4'))

PHP向けAmazon S3 SDK

次の例では、Amazon S3 SDK for PHP 3.109.3が使用されています。 次の手順では、s3Clientインスタンスを初期化する方法について説明します。

  1. AWS設定ファイルと証明書ファイルを変更します。

    次の例は、Linuxで構成を初期化する方法を示しています。

    1. 次の構成情報を ~/.aws/configの構成ファイルに追加します。

      [default]
      s3 =
      addressing_style = virtual
    2. 設定ファイルの一時的なアクセス資格情報を ~/.aws/credentialsで設定します。

      [default]
      aws_access_key_id = [OSS_AccessKeyId]
      aws_secret_access_key = [OSS_AccessKeySecret]
      aws_secret_sessiontoken = [OSS_SessionToken]
  2. s3Clientインスタンスを初期化します。

    <?php
    require_once __DIR__ . '/vendor/autoload.php';
    
    use Aws\Credentials\CredentialProvider;
    use Aws\Credentials\Credentials;
    use Aws\S3\S3Client;
    
    $provider = CredentialProvider::fromCredentials(new Credentials(
        getenv('OSS_ACCESS_KEY_ID'),
        getenv('OSS_ACCESS_KEY_SECRET'),
        getenv('OSS_SESSION_TOKEN')
    ));
    
    // Create an s3Client instance. 
    $s3Client = new S3Client([
        'region' => 'oss-cn-hangzhou',
        'version' => '2006-03-01',
        'endpoint' => 'http://oss-cn-hangzhou.aliyuncs.com',
        'credentials' => $provider
    ]);

Node.js SDK

次の例では、Amazon S3 SDK for Node.js 2.509.0が使用されています。 次のサンプルコードは、s3Clientインスタンスを初期化する方法の例を示しています。

const S3 = require("@aws-sdk/client-s3");

const { S3Client, PutObjectCommand } = S3;

// Initialize the s3Client instance. 
const region = "oss-cn-chengdu";
const s3Client = new S3Client({
  region,
  endpoint: `https://${region}.aliyuncs.com`,
  credentials: {
    accessKeyId: process.env.AccessKeyId,
    secretAccessKey: process.env.AccessKeySecret,
    sessionToken: process.env.SecurityToken,
  },
});

// Use the an s3Client instance to perform operations, such as uploading objects. 
async function uploadObject() {
  const command = new PutObjectCommand({
    // Specify the name of the bucket. 
    Bucket: "yourbucket", 
    // Specify the full paths of the object and the local file. Do not include the bucket name in the full path of the object. 
    Key: "file.txt",
    // Specify the object content or buffer. 
    Body: "Hello from AWS SDK v3!",
  });

  try {
    const response = await s3Client.send(command);
    console.log("Object uploaded successfully", response);
  } catch (error) {
    console.error("Error uploading object:", error);
  }
}

uploadObject();

.NET SDK

次の例では、Amazon S3 SDK forです。NET 3.3.104.12が使用されます。 次のサンプルコードは、s3Clientインスタンスを初期化する方法の例を示しています。

string sAccessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
string sAccessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
string sToken = Environment.GetEnvironmentVariable("OSS_SESSION_TOKEN");
string endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

var config = newAmazonS3Config(){ServiceURL=endpoint};
var client = new AmazonS3Client(sAccessKeyId, sAccessKeySecret, sToken, config);

Android SDK

重要

モバイルデバイスは、様々な環境で使用される。 リクエストに署名するためにモバイルデバイスに永続的に有効なAccessKeyペアを保存することは非常に危険です。 一時的なアクセス資格情報を取得するには、Security Token Service (STS) を使用することを推奨します。 詳細については、「STSが提供する一時的な資格情報を使用したOSSへのアクセス」をご参照ください。

次の例では、Amazon S3 SDK for Android 2.14.2が使用されています。 次のサンプルコードは、s3Clientインスタンスを初期化する方法の例を示しています。

AmazonS3Client s3 = new AmazonS3Client(new AWSCredentialsProvider() {
    @Override
    public AWSCredentials getCredentials() {
         // Obtain the temporary access credentials from STS. 
        return new BasicSessionCredentials(
                "StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"
        );
    }

    @Override
    public void refresh() {
        //
    }
});
// Specify an endpoint. 
s3.setEndpoint("oss-cn-hongkong.aliyuncs.com");

iOS用Amazon S3 SDK

重要

モバイルデバイスは、様々な環境で使用される。 リクエストに署名するためにモバイルデバイスに永続的に有効なAccessKeyペアを保存することは非常に危険です。 一時的なアクセス資格情報を取得するには、Security Token Service (STS) を使用することを推奨します。 詳細については、「STSが提供する一時的な資格情報を使用したOSSへのアクセス」をご参照ください。

次の例では、iOS 2.10.2用のAmazon S3 SDKが使用されています。 次の手順では、s3Clientインスタンスを初期化する方法について説明します。

  1. AWSCredentialsProviderプロトコルを実装します。

    -(AWSTask<AWSCredentials *> *)credentials{
        // Obtain the temporary access credentials from STS. 
        AWSCredentials *credential = [[AWSCredentials alloc]initWithAccessKey:@"StsToken.AccessKeyId" secretKey:@"StsToken.SecretKeyId" sessionKey:@"StsToken.SecurityToken" expiration:[NSDate dateWithTimeIntervalSince1970:1565770577]];
    
        return [AWSTask taskWithResult:credential];
    
    }
    
    - (void)invalidateCachedTemporaryCredentials{
    
    }
  2. インスタンスを初期化します。

    NSURL* bucketURL = [NSURL URLWithString:@"https://oss-cn-hongkong.aliyuncs.com"];
    
    AWSEndpoint* endpoint = [[AWSEndpoint alloc] initWithRegion:AWSRegionUnknown service:AWSServiceS3 URL:bucketURL];
    AWSServiceConfiguration* configuration = [[AWSServiceConfiguration alloc]
        initWithRegion:AWSRegionUSEast2 endpoint:endpoint
        credentialsProvider:[MyCredentialProvider new]];
    
    [[AWSServiceManager defaultServiceManager] setDefaultServiceConfiguration:configuration];

Amazon S3 SDK for Go

  • バージョン1.x

    次の例では、Amazon S3 SDK for Go 1.21.9が使用されています。 次のサンプルコードは、s3Clientインスタンスを初期化する方法の例を示しています。

    package main
    
    import (
      "fmt"
      "github.com/aws/aws-sdk-go/aws"
      "github.com/aws/aws-sdk-go/aws/credentials"
      "github.com/aws/aws-sdk-go/aws/session"
      "github.com/aws/aws-sdk-go/service/s3"
      "log"
      "os"
    )
    
    func main() {
      sess, _ := newSession()
      service := s3.New(sess)
    
      bucket := "demo-bucket"
    
      key := "demo"
      result, err := service.GetObject(&s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
      })
    
      if err != nil {
        log.Printf("LoadDefaultConfig error: %v", err)
        return
      }
    
      fmt.Printf("result:%#v\n", result)
    }
    
    func newSession() (*session.Session, error) {
      accessID := os.Getenv("OSS_ACCESS_KEY_ID")
      accessKey := os.Getenv("OSS_ACCESS_KEY_SECRET")
      token := os.Getenv("OSS_SESSION_TOKEN")
      creds := credentials.NewStaticCredentials(accessID, accessKey, token)
      region := "oss-cn-hangzhou"
      endpoint := "https://oss-cn-hangzhou.aliyuncs.com"
      config := &aws.Config{
        Region:           aws.String(region),
        Endpoint:         &endpoint,
        S3ForcePathStyle: aws.Bool(false),
        Credentials:      creds,
      }
      return session.NewSession(config)
    }
  • バージョン2.x

    次の例では、Amazon S3 SDK for Go 2.xが使用されています。 次のサンプルコードは、s3Clientインスタンスを初期化する方法の例を示しています。

    package main
    
    import (
      "context"
      "fmt"
      "github.com/aws/aws-sdk-go-v2/aws"
      awsconfig "github.com/aws/aws-sdk-go-v2/config"
      "github.com/aws/aws-sdk-go-v2/credentials"
      "github.com/aws/aws-sdk-go-v2/service/s3"
      "log"
      "os"
    )
    
    func main() {
    
      // Specify the name of the bucket. 
      bucketName := "demo-bucket"
      // Specify the full path of the object. Do not include the bucket name in the full path. 
      fileName := "demo.go"
      customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
        return aws.Endpoint{
          PartitionID:   "oss",
          URL:           "https://oss-cn-hangzhou.aliyuncs.com",
          SigningRegion: "cn-hangzhou",
        }, nil
      })
    
      envCredential, err := NewEnvironmentVariableCredentials()
      if err != nil {
        log.Printf("error: %v", err)
        return
      }
      provider := NewAwsS3Provider(envCredential)
      cfg, err := awsconfig.LoadDefaultConfig(context.TODO(), awsconfig.WithCredentialsProvider(provider), awsconfig.WithEndpointResolverWithOptions(customResolver))
    
      if err != nil {
        log.Printf("LoadDefaultConfig error: %v", err)
        return
      }
      awsS3Client := s3.NewFromConfig(cfg)
      //fp, _ := os.Open(fileName)
      //defer fp.Close()
      result, err := awsS3Client.GetObject(context.TODO(), &s3.GetObjectInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(fileName),
      })
      if err != nil {
        log.Printf("GetObject error: %v", err)
        return
      }
      fmt.Printf("result:%#v\n", result)
    }
    
    type Credentials struct {
      AccessKeyId     string
      AccessKeySecret string
      SecurityToken   string
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
      return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
      return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
      return credentials.SecurityToken
    }
    
    func NewAwsS3Provider(credential *Credentials) credentials.StaticCredentialsProvider {
      return credentials.StaticCredentialsProvider{
        Value: aws.Credentials{
          AccessKeyID:     credential.AccessKeyId,
          SecretAccessKey: credential.AccessKeySecret,
          SessionToken:    credential.SecurityToken,
        },
      }
    }
    
    func NewEnvironmentVariableCredentials() (*Credentials, error) {
      var envCredential *Credentials
      accessID := os.Getenv("OSS_ACCESS_KEY_ID")
      if accessID == "" {
        return envCredential, fmt.Errorf("access key id is empty!")
      }
      accessKey := os.Getenv("OSS_ACCESS_KEY_SECRET")
      if accessKey == "" {
        return envCredential, fmt.Errorf("access key secret is empty!")
      }
      token := os.Getenv("OSS_SESSION_TOKEN")
      envCredential = &Credentials{
        AccessKeyId:     accessID,
        AccessKeySecret: accessKey,
        SecurityToken:   token,
      }
    
      return envCredential, nil
    }
    

Amazon S3 SDK for C ++

次の例では、AWS S3 SDK for C ++ 1.7.68が使用されています。 次のサンプルコードは、設定を初期化する方法の例を示しています。

  1. AWS設定ファイルと証明書ファイルを変更します。

    次の例は、Linuxで構成を初期化する方法を示しています。

    1. 次の構成情報を ~/.aws/configの構成ファイルに追加します。

      [default]
      s3 =
      addressing_style = virtual
    2. ~/.aws/credentialsに格納されている証明書ファイルでAccessKeyペアを指定します。

      [default]
      aws_access_key_id = [OSS_AccessKeyId]
      aws_secret_access_key = [OSS_AccessKeySecret]
      aws_secret_sessiontoken = [OSS_SessionToken]
  2. エンドポイントを指定します。

    Aws::Client::ClientConfiguration awsCC;
    awsCC.scheme = Aws::Http::Scheme::HTTP;
    awsCC.region = "oss-cn-hongkong";
    awsCC.endpointOverride = "oss-cn-hongkong.aliyuncs.com";
    Aws::S3::S3Client s3_client(awsCC);