Alibaba Cloud のルートアカウント(root アカウント)の認証情報を使用するよりも、Resource Access Management (RAM) ユーザーの AccessKey ペアを用いて OSS にアクセスする方がセキュリティ面で優れています。これは、RAM ユーザーに対して必要な最小限の権限のみを付与できるためです。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
RAM 管理者権限を持つ Alibaba Cloud アカウント
オブジェクトをアップロードするための OSS バケット
手順 1:RAM ユーザーの作成
Alibaba Cloud アカウントまたは RAM 管理者として、RAM コンソール にログインします。
左側のナビゲーションウィンドウで、ID > ユーザー を選択します。
ユーザー ページで、ユーザーの作成 をクリックします。
ユーザー アカウント情報 セクションで、以下のフィールドを設定します。
説明複数の RAM ユーザーを一度に作成する場合は、ユーザーの追加 をクリックします。
フィールド 説明 ログイン名 最大 64 文字。英字、数字、ピリオド (.)、ハイフン (-)、アンダースコア (_) を使用できます。 表示名 最大 128 文字。 タグ 編集アイコンをクリックして、タグキーとタグ値を入力します。タグは、RAM ユーザーの分類および管理に役立ちます。 アクセスモード セクションで、永続的な AccessKey を使用したアクセス を選択し、OK をクリックします。
コピー をクリックして、AccessKey ペアを保存します。
重要AccessKey Secret は、AccessKey ペアが初めて作成されたときのみ表示されます。その後は取得できません。AccessKey ID と AccessKey Secret の両方を、安全な場所にコピーしてください。Secret を紛失した場合、新しい AccessKey ペアを作成する必要があります。
手順 2:RAM ユーザーにオブジェクトのアップロード権限を付与
カスタムポリシーの作成
左側のナビゲーションウィンドウで、権限 > ポリシー を選択します。
ポリシー ページで、ポリシーの作成 をクリックします。
ポリシーの作成 ページで、JSON タブをクリックし、以下のポリシードキュメントを入力します。この例では、
oss:PutObject権限を、exampledirディレクトリ(examplebucket内)に付与しています。警告この例は参考用です。過剰な権限を付与しないよう、実際の要件に応じて詳細な RAM ポリシーを設定してください。詳細については、「例 9:RAM または STS を使用した OSS リソースへのユーザー権限付与」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:examplebucket/exampledir/*" } ] }OK をクリックします。
ポリシー名 を
RamTestPolicyに設定し、OK をクリックします。
RAM ユーザーへのポリシーのアタッチ
左側のナビゲーションウィンドウで、ID > ユーザー を選択します。
ユーザー ページで、対象の RAM ユーザーを検索し、[操作] 列の 権限の追加 をクリックします。
権限の付与 パネルで、カスタムポリシー タブをクリックし、
RamTestPolicyを選択して、OK をクリックします。
手順 3:RAM ユーザーの AccessKey ペアを用いたオブジェクトのアップロード
以下の例では、Java SDK(署名バージョン 4)を用いて、ローカルファイル (examplefile.txt) を、exampledir/exampleobject.txt(examplebucket 内)にアップロードします。
環境変数の設定
SDK がコード内にハードコーディングせずに認証情報を読み込めるよう、AccessKey ペアを環境変数として設定します。
Linux/macOS:
setx OSS_ACCESS_KEY_ID "<お使いのアクセスキー ID>"
setx OSS_ACCESS_KEY_SECRET "<お使いのアクセスキー シークレット>"Windows(コマンドプロンプト):
setx OSS_ACCESS_KEY_ID "<your-accesskey-id>"
setx OSS_ACCESS_KEY_SECRET "<your-accesskey-secret>"<your-accesskey-id> および <your-accesskey-secret> は、手順 1 でコピーした値に置き換えてください。
オブジェクトのアップロード
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Exception {
// 中国 (杭州) リージョンのエンドポイント。実際のエンドポイントに置き換えてください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数から認証情報を読み込みます。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケット名。
String bucketName = "examplebucket";
// バケット内のオブジェクトのフルパス。バケット名は含めません。
String objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルのフルパス。
String filePath = "D:\\localpath\\examplefile.txt";
// バケットが配置されているリージョン。
String region = "cn-hangzhou";
// 署名バージョン 4 を使用して OSSClient インスタンスを作成します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("OSS がリクエストを拒否しました: " + oe.getErrorMessage());
System.out.println("エラーコード: " + oe.getErrorCode());
System.out.println("リクエスト ID: " + oe.getRequestId());
System.out.println("ホスト ID: " + oe.getHostId());
} catch (ClientException ce) {
System.out.println("クライアントエラー(例:ネットワーク障害): " + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}他の言語の例については、以下をご参照ください。
よくある質問
AccessKey ID はどこで確認できますか? AccessKey Secret は後から取得できますか?
アップロード時に AccessDenied エラーが発生しました。何を確認すればよいですか?
特定のエラー種別を判別するにはどうすればよいですか?
NoSuchBucket エラーが発生しました。原因は何ですか?
「The bucket you are attempting to access must be addressed using the specified endpoint.」というエラーが発生しました。原因は何ですか?
次のステップ
認証情報を公開せずに第三者とアップロード済みオブジェクトを共有するには、一時的なアクセスを許可する署名付き URL を生成します。「署名付き URL を使用したオブジェクトのダウンロード」をご参照ください。