このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースへの一時的なアクセスを許可する方法について説明します。
STSの一時アクセス資格情報と署名付きURLに有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、STSの一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
STS を使用した一時的アクセス許可
STSを使用して、OSSへの一時アクセスを許可できます。 STSは、ユーザーに一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、STSとは何ですか?.
STSには次の利点があります。
一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 このトークンのアクセス権限と有効期間を指定できます。
有効期間が終了すると、トークンは自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。
一時的なアクセス資格情報を取得します。
一時的なアクセス資格情報は、AccessKeyペアとセキュリティトークンで構成されます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 一時的なアクセス資格情報の有効期間は秒単位です。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。
次のいずれかの方法を使用して、一時的なアクセス資格情報を取得できます。
方法 1
AssumeRole操作を呼び出して、一時的なアクセス資格情報を取得します。
方法 2
STS SDKを使用して一時的なアクセス資格情報を取得します。 詳細については、「STS SDKの概要」をご参照ください。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスします。
STSから取得した一時的なアクセス資格情報を使用してローカルファイルをアップロードする
パッケージメイン import (import (import) "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" "os" ) func main() { // 環境変数から一時的なアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、およびOSS_SESSION_TOKEN環境変数が設定されていることを確認してください。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 実際のエンドポイントを指定します。 client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider)) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // バケットの名前を指定します。 例: examplebucket. bucketName := "examplebucket" // オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 例: exampledir/exampleobject.txt。 objectName := "exampledir/exampleobject.txt" // アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 filepath := "D :\\ localpath\\examplefile.txt" bucket,err := client.Bucket(bucketName) // STSから取得した一時的なアクセス資格情報を使用して、サードパーティユーザーにオブジェクトをアップロードする権限を付与します。 err = bucket.PutObjectFromFile(objectName,filepath) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Println (「アップロード成功」) }
STSから取得した一時的なアクセス資格情報を使用してオブジェクトをダウンロードする
パッケージメイン import (import (import) "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" "os" ) func main() { // 環境変数から一時的なアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、およびOSS_SESSION_TOKEN環境変数が設定されていることを確認してください。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 実際のエンドポイントを指定します。 client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider)) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // バケットの名前を指定します。 例: examplebucket. bucketName := "examplebucket" // オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 例: exampledir/exampleobject.txt。 objectName := "exampledir/exampleobject.txt" // アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 filepath := "D :\\ localpath\\examplefile.txt" bucket,err := client.Bucket(bucketName) // STSから取得した一時的なアクセス資格情報を使用して、サードパーティユーザーにオブジェクトをダウンロードする権限を付与します。 err = bucket.GetObjectToFile(objectName,filepath) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Println (「ダウンロード成功」) }
署名付きURLを使用して一時アクセスを許可する
使用上の注意
OSS SDKを使用して署名付きURLを生成する場合、OSS SDKはローカルコンピューターに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、URLに署名を追加してURLの有効性とセキュリティを確保します。 URLを計算し構築するために実行される操作は、クライアント上で完了する。 ネットワーク経由でサーバーにリクエストを送信する必要はありません。 この方法では、署名付きURLを生成するときに、呼び出し元に特定の権限を付与する必要はありません。 ただし、サードパーティのユーザーが署名付きURLによって承認されたリソースに対して関連する操作を実行できるようにするには、API操作を呼び出して署名付きURLを生成するプリンシパルに対応する権限があることを確認する必要があります。
たとえば、プリンシパルが署名付きURLを使用してオブジェクトをアップロードする場合は、プリンシパルにoss:PutObject権限を付与する必要があります。 プリンシパルが署名付きURLを使用してオブジェクトをダウンロードまたはプレビューする場合は、プリンシパルにoss:GetObject権限を付与する必要があります。
署名付きURLを生成し、一時的なアクセスのために訪問者にURLを提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が特定のデータにアクセスできる期間を制限できます。
HTTPS経由でリソースにアクセスするために使用される署名付きURLを生成するには、エンドポイントのプロトコルをHTTPSに設定します。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (
+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を% 2B
に置き換えます。 そうでない場合、署名付きURLを使用してオブジェクトにアクセスすることはできません。
このセクションでは、署名付きURLを生成してOSSへの一時アクセスを許可する方法の例を示します。 署名付きURLを使用して一時アクセスを許可するために使用される完全なコードについては、GitHubをご覧ください。