アクセスポイントは、バケットにアクセスするための固有のエントリーポイントを提供します。複数のアプリケーションまたはチームが異なる権限で同一のバケットにアクセスする必要がある場合、それぞれに個別のアクセスポイントを作成できます。その後、アクセスポイントポリシーを使用して各アクセスポイントの権限を管理することで、単一のバケットポリシー内に複雑な権限ルールを維持する手間を省くことができます。
仕組み
アクセスポイントは、バケットへのアクセスプロキシレイヤーとして機能します。アクセスポイントを作成すると、OSS により固有の アクセスポイントエイリアス が生成されます。このエイリアスをバケット名の代わりに使用してリクエストを行います。各アクセスポイントには、許可される操作、リソース、ID を定義する個別の アクセスポイントポリシー と、インターネットや指定された VPC などの ネットワークオリジン を設定でき、これによりシナリオごとの分離されたアクセスが可能になります。
ユーザーがアクセスポイント経由でリクエストを行うと、システムは RAM ポリシー、バケットポリシー、およびアクセスポイントポリシーを同時に評価します。リクエストが許可されるのは、RAM ポリシーとバケットポリシーの組み合わせ、およびアクセスポイントポリシーの両方が「Allow(許可)」と評価された場合のみです。権限の評価方法の詳細については、「権限評価ロジック」をご参照ください。
デフォルトでは、アクセスポイントはバケットリソースにアクセスできません。まず、バケットポリシー内で oss:DataAccessPointArn、oss:DataAccessPointAccount、または oss:AccessPointNetworkOrigin の条件キーを使用して、アクセスポイントに対する明示的な権限委譲を構成する必要があります。
クイックスタート
本セクションでは、アクセスポイントの作成、権限委譲の構成、およびアクセスポイントを使用したリソースへのアクセスという 3 つのステップを説明します。
ステップ 1:アクセスポイントの作成
アクセスポイントを作成し、そのアクセスポイントポリシーを構成して、誰が、どのような操作を、どの OSS リソースに対して、どのような条件下で実行できるかを定義します。
アクセスポイント一覧 に移動し、アクセスポイントの作成 をクリックします。
アクセスポイント名 を入力し、関連付けるバケットと ネットワークオリジン を選択してから、次へ をクリックします。
説明ネットワークオリジン を VPC に設定する場合、VPC ID を入力する必要があります。VPC コンソール から VPC ID を取得できます。
指定された VPC のリージョンは、OSS ゲートウェイエンドポイントをサポートするリージョン のいずれかである必要があります。リージョンが一致しない場合、認証リクエストが指定された VPC と正しく関連付けられず、認証に失敗します。
公開アクセス禁止 オプションをオフにして、アクセスポイントポリシーを構成します。
GUI
パラメーター
説明
関連リソース
バケット全体 または 指定されたリソース へのアクセスを許可するかどうかを選択します。
リソースパス
関連リソース を バケット全体 に設定した場合、リソースパス は
accesspoint/{Access Point Name}/*に設定されます。関連リソース を 指定されたリソース に設定した場合、許可するディレクトリまたは個別のオブジェクトを入力します。複数のエントリを追加できます。
ユーザー
権限付与先を指定します。
RAM ユーザー:現在の Alibaba Cloud アカウントに属する RAM ユーザーを選択します。
ログインに使用するアカウントは、Alibaba Cloud アカウント、またはバケットに対する管理権限と RAM コンソールでの
ListUsers権限を持つ RAM ユーザーである必要があります。そうでない場合、現在のアカウントの RAM ユーザーリストを表示できません。他のアカウント:他のアカウントまたは RAM ユーザーの UID、または ARN が
arn:stsで始まる偽装ロールユーザー(例:arn:sts::1798************:assumed-role/role-name/session-name)を入力します。複数のユーザーに権限を付与できます。1 行につき 1 つのエントリを記述してください。
許可された操作
簡易設定:一般的な操作の組み合わせを選択します。オプションには、読み取り専用 (ListObject を除く)、読み取り専用 (ListObject を除く)、読み取り/書き込み、フルコントロール、および アクセス拒否 があります。
詳細設定:効果(許可する または 拒否)と 操作 をカスタマイズします。
構文
エディターに JSON 形式で権限付与ポリシーを入力します。
ポリシー例:ユーザー
20816353761158****に読み取り/書き込み権限を付与します。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl", "oss:PutObjectAcl", "oss:ListObjects", "oss:AbortMultipartUpload", "oss:ListParts", "oss:RestoreObject", "oss:ListObjectVersions", "oss:GetObjectVersion", "oss:GetObjectVersionAcl", "oss:RestoreObjectVersion" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}/object/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}" ], "Condition": { "StringLike": { "oss:Prefix": [ "*" ] } } }] }完全なポリシードキュメントには、Version(バージョン番号)と Statement(ポリシー文)が含まれます。
Version:ポリシーのバージョン。この値は固定で
1であり、変更できません。Statement:個別のポリシールール。ポリシーは 1 つ以上の文で構成されます。各権限付与文には、Effect、Action、Principal、Resource、および Condition が含まれます。
ポリシー要素
説明
Effect
ポリシーの効果。有効な値は
AllowおよびDenyです。Action
リソースに対して実行する操作。アスタリスク (
*) ワイルドカードがサポートされています。Principal
ポリシーが適用されるユーザー、アカウント、またはロール。
Resource
ポリシーが適用されるリソース。
Condition
ポリシーが有効になる条件。
複数の条件が指定されている場合、論理積(AND)で評価され、すべての条件を満たす必要があります。
ポリシー要素の完全な一覧については、「権限付与構文と要素」をご参照ください。
送信 をクリックし、アクセスポイントの作成完了を待ちます。
ステップ 2:権限の委譲
アクセスポイントを作成した後、バケットポリシー内で権限委譲を構成して、どのアクセスポイントがバケットにアクセスできるかを定義する必要があります。以下の 3 種類の権限委譲が利用可能です。
oss:DataAccessPointArn:特定のアクセスポイントに対するアクセス権限を委譲します。oss:DataAccessPointAccount:現在の Alibaba Cloud アカウント配下のすべてのアクセスポイントに対するアクセス権限を委譲します。oss:AccessPointNetworkOrigin:特定のネットワークオリジンを持つすべてのアクセスポイントに対するアクセス権限を委譲します。
特定のアクセスポイント
バケット一覧 に移動し、対象のバケット名をクリックします。
左側のナビゲーションウィンドウで、 を選択し、構文でルールを追加 タブをクリックします。
編集 をクリックし、エディターに JSON 形式で権限付与ポリシーを入力します。
説明ポリシーを構成する際は、例に含まれる UID、バケット名、リージョン ID、およびアクセスポイント名を実際の値に置き換えてください。バケットポリシーにすでに文が含まれている場合は、このルールを
Statement配列に追加します。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:DataAccessPointArn": [ "acs:oss:oss-{region-id}:179882766168****:accesspoint/{ap-name}" ] } } }] }保存 をクリックして、バケットポリシーを適用します。
すべてのアクセスポイント
バケット一覧 に移動し、対象のバケット名をクリックします。
左側のナビゲーションウィンドウで、 を選択し、構文でルールを追加 タブをクリックします。
編集 をクリックし、エディターに JSON 形式で権限付与ポリシーを入力します。
説明ポリシーを構成する際は、例に含まれる UID およびバケット名を実際の値に置き換えてください。バケットポリシーにすでに文が含まれている場合は、このルールを
Statement配列に追加します。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:DataAccessPointAccount": [ "179882766168****" ] } } }] }保存 をクリックして、バケットポリシーを適用します。
ネットワークオリジン別
バケット一覧 に移動し、対象のバケット名をクリックします。
左側のナビゲーションウィンドウで、 を選択し、構文でルールを追加 タブをクリックします。
編集 をクリックし、エディターに JSON 形式で権限付与ポリシーを入力します。
説明ポリシーを構成する際は、例に含まれる UID およびバケット名を実際の値に置き換えてください。バケットポリシーにすでに文が含まれている場合は、このルールを
Statement配列に追加します。oss:AccessPointNetworkOriginをinternetに設定すると、ネットワークオリジンがインターネットであるすべてのアクセスポイントに対して権限が委譲されます。この構成では、インターネットおよび VPC の両方からのアクセスが許可されます。VPC からのアクセスのみを許可するには、値をvpcに変更してください。
{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:AccessPointNetworkOrigin": [ "internet" ] } } }] }保存 をクリックして、バケットポリシーを適用します。
「バケットポリシーに公開アクセスのセマンティクスが含まれています」といったエラーメッセージが表示された場合は、アクセスポイントの権限委譲を行う前に、バケットの 公開アクセス禁止 設定をオフにしてください。
ステップ 3:リソースへのアクセス
RAM ユーザーなどの権限付与済み ID は、このエイリアスを使用して対応する OSS リソースにアクセスできます。
SDK
現在、OSS リソースにアクセスポイントエイリアスを使用してアクセスできるのは、Java SDK および Python SDK のみです。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.GetObjectRequest;
import java.io.File;
/**
* OSS Java SDK V2 例:アクセスポイントを使用してオブジェクトをローカルファイルにダウンロードします。
*/
public class DownloadObjectWithAccessPoint {
public static void main(String[] args) {
// OSS クライアントを作成します。
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
CredentialsProvider provider = new StaticCredentialsProvider(accessKeyId, accessKeySecret);
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region("<region-id>")
.build();
// アクセスポイントエイリアスを使用して、オブジェクトをローカルファイルにダウンロードします。
String bucket = "example-ap-b156d01070a10322664d6704cd1d47****-ossalias";
String key = "example.jpg";
File file = new File("example.jpg");
client.getObjectToFile(GetObjectRequest.newBuilder()
.bucket(bucket)
.key(key)
.build(), file);
System.out.println("Download complete: " + key + " -> " + file.getPath());
// クライアントを閉じます。
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""OSS Python SDK V2 例:アクセスポイントを使用してオブジェクトをローカルファイルにダウンロードします。"""
import alibabacloud_oss_v2 as oss
def main() -> None:
"""メイン関数"""
# OSS クライアントを作成します。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
config = oss.config.load_default()
config.credentials_provider = credentials_provider
config.region = "<region-id>"
config.endpoint = "oss-<region-id>.aliyuncs.com"
client = oss.Client(config)
# アクセスポイントエイリアスを使用して、オブジェクトをローカルファイルにダウンロードします。
bucket = "example-ap-b156d01070a10322664d6704cd1d47****-ossalias"
key = "example.jpg"
file_path = "example.jpg"
request = oss.GetObjectRequest(bucket, key)
client.get_object_to_file(request, file_path)
print(f"Download complete: {key} -> {file_path}")
if __name__ == "__main__":
main()
ossutil
ossutil を使用して OSS リソースにアクセスする場合は、バケット名としてアクセスポイントエイリアスを使用します。
ossutil cp oss://example-ap-b156d01070a10322664d6704cd1d47****-ossalias/example.jpg /tmpREST API
REST API を使用して OSS リソースにアクセスする場合は、Host ヘッダーにアクセスポイントエイリアスを使用します。以下にリクエスト例を示します。
GET /ObjectName HTTP/1.1
Host: example-ap-b156d01070a10322664d6704cd1d47****-ossalias.oss-{region-id}.aliyuncs.com
Date: GMT Date
Authorization: SignatureValueシナリオ例
この例では、ビッグデータ分析のシナリオにおいて、複数の部門に安全かつ分離されたアクセスを提供するためにアクセスポイントを使用する方法を示します。
シナリオ
ある企業(Alibaba Cloud アカウント UID:137918634953****)は、中央集約型のデータを examplebucket という名前のバケットに保存しています。10 個の異なる事業部門が、以下の要件に基づいてこのバケットにアクセスする必要があります。
部門 | アクセス範囲 | 権限 | ネットワークオリジン |
部門 1~3 |
| 読み取り専用 | インターネット |
部門 4 | バケット全体 | 読み取り/書き込み | インターネット |
部門 5~10 |
| 読み取り/書き込み | VPC のみ |
ソリューション設計
ビジネスの分離およびセキュリティ境界の要件に基づき、異なるアクセスシナリオ向けに 3 つのアクセスポイントを設計できます。アクセスポイントポリシーを使用して、正確な権限制御およびネットワークアクセス制限を実装します。
アクセスポイント | パラメーター | ネットワークオリジン | 権限付与先 | 許可リソース | 権限 |
アクセスポイント 1 |
| インターネット | 部門 1~3 の RAM ユーザー(UID: |
| 読み取り専用 |
アクセスポイント 2 |
| インターネット | 部門 4 の RAM ユーザー(UID: |
| 読み取り/書き込み |
アクセスポイント 3 |
| VPC | 部門 5~10 の RAM ユーザー(UID: |
| 読み取り/書き込み |
アクセスポイントポリシー
ap-01:読み取り専用アクセス
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:GetObjectAcl",
"oss:ListObjects",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"26571698800555****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-01/object/dir1/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"26571698800555****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-01"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"dir1/*"
]
}
}
}]
}ap-02:読み取り/書き込みアクセス
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:ListObjects",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"25770968794578****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-02/object/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"25770968794578****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-02"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"*"
]
}
}
}]
}ap-03:VPC 読み取り/書き込みアクセス
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:ListObjects",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"26806658794579****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-03/object/dir2/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"26806658794579****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-03"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"dir2/*"
]
}
}
}]
}バケットポリシーによる権限委譲
このシナリオでは同一アカウント配下に複数のアクセスポイントが存在するため、oss:DataAccessPointAccount を使用して統一的に権限委譲を行い、バケットポリシーを簡素化できます。より細かい制御が必要な場合は、oss:DataAccessPointArn を使用して、各アクセスポイントごとに個別に権限を委譲することも可能です。
統一委譲
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:137918634953****:examplebucket",
"acs:oss:*:137918634953****:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:DataAccessPointAccount": [
"137918634953****"
]
}
}
}]
}個別委譲
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:137918634953****:examplebucket",
"acs:oss:*:137918634953****:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:DataAccessPointArn": [
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-01",
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-02",
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-03"
]
}
}
}]
}権限評価ロジック
RAM ポリシーおよびバケットポリシーの結果 | アクセスポイントポリシーの結果 | 最終結果 |
Allow | Allow | Allow |
Allow | Deny | Deny |
Allow | Implicit Deny | Implicit Deny |
Deny | Allow | Deny |
Deny | Deny | Deny |
Deny | Implicit Deny | Deny |
Implicit Deny | Allow | Implicit Deny |
Implicit Deny | Deny | Deny |
Implicit Deny | Implicit Deny | Implicit Deny |
Allow:アクセスリクエストがポリシー内の Allow 文に一致し、かつ Deny 文に一致しない場合。
明示的拒否:アクセスリクエストがポリシー内の Deny 文に一致する場合。Deny 文は優先されるため、Allow 文にも一致していても、結果は明示的に拒否されます。
暗黙的拒否:アクセスリクエストが Allow 文にも Deny 文にも一致しない場合。デフォルトでは、RAM ID はいかなる操作も実行する権限を持ちません。明示的に許可されていない操作はすべて暗黙的に拒否されます。
クォータと制限事項
制限事項 | 説明 |
作成方法 | OSS コンソール、API、ossutil を使用してアクセスポイントを作成できますが、SDK では作成できません。 |
アクセスポイントの数 | 各 Alibaba Cloud アカウントは、最大 1,000 個のアクセスポイントを作成できます。 |
変更ルール | アクセスポイントを作成した後は、アクセスポイントポリシーのみ変更できます。アクセスポイント名やアクセスポイントエイリアスなどの基本情報は変更できません。 |
アクセス方法 | 匿名アクセスはサポートされていません。 |
よくある質問
IP アドレス許可リストのサポート
はい。アクセスポイントポリシーの Condition ブロックに条件を追加します。例:"IpAddress": {"acs:SourceIp": ["192.0.2.0/24"]}。
作成に必要な権限
以下の権限が必要です:oss:CreateAccessPoint、oss:GetAccessPoint、oss:DeleteAccessPoint、oss:ListAccessPoints、oss:PutAccessPointPolicy、oss:GetAccessPointPolicy、oss:DeleteAccessPointPolicy、oss:PutBucketPolicy、oss:GetBucketPolicy、および oss:DeleteBucketPolicy。