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

Object Storage Service:OSS SDK for Goを使用してアクセスを許可する

最終更新日:Jun 12, 2024

このトピックでは、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にアクセスするには、次の操作を実行します。

  1. 一時的なアクセス資格情報を取得します。

    一時的なアクセス資格情報は、AccessKeyペアとセキュリティトークンで構成されます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 一時的なアクセス資格情報の有効期間は秒単位です。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。

    次のいずれかの方法を使用して、一時的なアクセス資格情報を取得できます。

    • 方法 1

      AssumeRole操作を呼び出して、一時的なアクセス資格情報を取得します。

    • 方法 2

      STS SDKを使用して一時的なアクセス資格情報を取得します。 詳細については、「STS SDKの概要」をご参照ください。

  2. 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をご覧ください。

署名付きURLを使用したローカルファイルのアップロード

  1. 署名付きURLを生成します。

    パッケージメイン
    
    import (import (import)
        "fmt"
        "os"
        「github.com/aliyun/aliyun-oss-go-sdk/oss」
    )
    
    func HandleError (エラーエラー) {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    
    func main() {
    // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err! =nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
    }
    // OSSClientインスタンスを作成します。 
    	// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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"
        bucket, err := client.Bucket(bucketName)
        if err! =nil {
            HandleError(err)
        }
        // ローカルファイルのアップロードに使用される署名付きURLを生成します。 署名付きURLの有効期間を60秒に設定します。 
        signedURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60)
        if err! =nil {
            HandleError(err)
        }
    
        // カスタムパラメーターを含む署名付きURLを使用してブラウザーからオブジェクトにアクセスするには、URLに含まれるContentType値がリクエストで指定されたContentType値と同じであることを確認します。 
        options := []oss.Option{
            oss.Meta("myprop", "mypropval"),
            oss.ContentType("text/plain") 、
        }
        
        signedURL, err = bucket.SignURL(objectName, oss.HTTPPut, 60, options...)
        if err! =nil {
            HandleError(err)
        }
        fmt.Printf("Sign Url:% s\n", signedURL)
    } 
  2. 署名付きURLを使用してオブジェクトをアップロードします。

    Androidモバイルデバイス用のOSS SDKを参照できます。 詳細については、「署名付きURLを使用したオブジェクトのアップロード」をご参照ください。

マルチパートアップロードで署名付きURLを使用したオブジェクトのアップロード

署名付きURLを使用して、サードパーティアプリケーションにマルチパートアップロードでラージオブジェクトのアップロードを許可する場合は、マルチパートアップロードタスクを開始し、各パートの署名付きURLを生成してから、サードパーティアプリケーションに署名付きURLを提供する必要があります。 次に、サードパーティアプリケーションは、署名付きURLを使用して、オブジェクトのすべての部分をアップロードし、それらの部分を組み合わせて完全なオブジェクトにすることができます。

次のサンプルコードは、マルチパートアップロードで署名付きURLを生成し、署名付きURLを使用してオブジェクトをアップロードする方法の例を示しています。

パッケージメイン

import (import (import)
    "crypto/md5"
    "encoding/base64"
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    「github.com/aliyun/aliyun-oss-go-sdk/sample」
    "io/ioutil"
    "os"
    "strconv"
)

func main() {
    // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
    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)
    }
    bucketName := "bucket_name"

    bucket,err := client.Bucket(bucketName)
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 
    objectName := "example.txt"
    // アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
    localFile := "D :\\ download\\demo.txt"

    // ローカルファイルを3つの部分に分割します。 
    chunks, err := oss.SplitFileByPartNum(localFile, 3)
    fd, err := os.Open(localFile)
    defer fd.Close()
    // ステップ1: マルチパートアップロードタスクを開始し、ストレージクラスを標準に設定します。 
    imur, err := bucket.InitiateMultipartUpload(objectName)
    // ステップ2: パーツをアップロードします。 
    var options []oss.Option

    for _, chunk := range chunks {
        // MD5暗号化を検証します。 
        // buf := make([]byte, chunk.Size)
        // fd.ReadAt(buf,chunk.Size)
        // sum := md5.Sum(buf)
        // b64 := base64.StdEncoding.EncodeToString(sum[:])
        // options = []oss. オプション {
        // oss.ContentMD5(b64) 、
        // }

        options = append(options, oss.AddParam("partNumber", strconv.Itoa(chunk.Number)))
        options = append(options, oss.AddParam("uploadId", imur.UploadID))
        // 署名付きURLを生成します。 
        signedURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60, オプション)
        if err! =nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        fmt.Printf("Signed URL:% s\n", signedURL)
    }
    
    lsRes, err := bucket.ListUploadedParts(imur)
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // パーツをトラバースし、ETag値を入力します。 
    var parts []oss.UploadPart
    for _, p := range lsRes.UploadedParts {
        parts = append(parts, oss.UploadPart{XMLName: p.XMLName, PartNumber: p.PartNumber, ETag: p.ETag})
    }

    // ステップ3: マルチパートアップロードタスクを完了します。 
    _, err := bucket.CompleteMultipartUpload(imur, parts)
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    fmt.Println("Uploaded")
} 

署名付きURLを使用したオブジェクトのダウンロード

  1. 署名付きURLを生成します。

    パッケージメイン
    
    import (import (import)
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
        "os"
    )
    
    func HandleError (エラーエラー) {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    
    func main() {
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        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"
        // ローカルコンピューターの指定されたパスにオブジェクトをダウンロードします。 同じ名前のファイルがすでにパスに存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。 
        bucket, err := client.Bucket(bucketName)
        if err! =nil {
            HandleError(err)
        }
    
        // オブジェクトをダウンロードするための特定の有効期間を持つ署名付きURLを生成します。 この例では、URLの有効期間は60秒です。 
        signedURL, err := bucket.SignURL(objectName, oss.HTTPGet, 60)
        if err! =nil {
            HandleError(err)
        }
        fmt.Printf("Sign Url:% s\n", signedURL)
    } 
  2. 署名付きURLを使用してオブジェクトをダウンロードします。

    Androidモバイルデバイス用のOSS SDKを参照できます。 詳細については、「署名付きURLを使用したオブジェクトのダウンロード」をご参照ください。

VersionIdヘッダーを含む署名付きURLの生成

次のサンプルコードは、VersionIdヘッダーを含む署名付きURLを生成する方法の例を示しています。

パッケージメイン

import (import (import)
"fmt"
「github.com/aliyun/aliyun-oss-go-sdk/oss」
"os"
)

func main() {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClientインスタンスを作成します。 
	// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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"
bucket, err := client.Bucket(bucketName)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}

// オブジェクトのバージョンIDを指定します。 
	// 特定の有効期間を持つ署名付きURLを生成します。 この例では、URLの有効期間は60秒です。 
	signedURL, err := bucket.SignURL(objectName, oss.HTTPGet, 60, oss.VersionId("CAEQEhiBgIDmgPf8mxgiIDA1YjZlNDIxY2ZmMzQ1MmU5MTM1Y2M4Yzk4 ******")))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}

fmt.Printf("Sign Url:% s\n", signedURL)
}