ブラウザの同一オリジンポリシーにより、異なるドメイン間でデータを交換したり、リソースを共有したりする際のクロスオリジンリクエストは拒否されます。この問題を解決するには、特定のドメイン名、メソッド、リクエストヘッダーからのアクセスを許可するオリジン間リソース共有 (CORS) ルールを設定します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「OSS SDK for Python 1.0 を使用したアクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化」をご参照ください。
CORS ルールを設定するには、
oss:PutBucketCors権限が必要です。CORS ルールを取得するには、oss:GetBucketCors権限が必要です。CORS ルールを削除するには、oss:DeleteBucketCors権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
オリジン間リソース共有ルールの設定
次のコードは、指定されたバケットの CORS ルールを設定する方法を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketCors, CorsRule
# 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントに対応するリージョン (例: cn-hangzhou) を指定します。注意:このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# yourBucketName を実際のバケット名に置き換えます。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
rule = CorsRule(allowed_origins=['*'],
allowed_methods=['GET', 'HEAD'],
allowed_headers=['*'],
max_age_seconds=1000)
# 既存のルールは上書きされます。
bucket.put_bucket_cors(BucketCors([rule])) オリジン間リソース共有ルールの取得
次のコードは、指定されたバケットの CORS ルールを取得する方法を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントに対応するリージョン (例: cn-hangzhou) を指定します。注意:このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# yourBucketName を実際のバケット名に置き換えます。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
try:
cors = bucket.get_bucket_cors()
except oss2.exceptions.NoSuchCors:
print('cors is not set')
else:
for rule in cors.rules:
print('AllowedOrigins={0}'.format(rule.allowed_origins))
print('AllowedMethods={0}'.format(rule.allowed_methods))
print('AllowedHeaders={0}'.format(rule.allowed_headers))
print('ExposeHeaders={0}'.format(rule.expose_headers))
print('MaxAgeSeconds={0}'.format(rule.max_age_seconds)) オリジン間リソース共有ルールの削除
次のコードは、指定されたバケットのすべての CORS ルールを削除する方法を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントに対応するリージョン (例: cn-hangzhou) を指定します。注意:このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# yourBucketName を実際のバケット名に置き換えます。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
bucket.delete_bucket_cors() 関連ドキュメント
CORS の完全なサンプルコードについては、「GitHub の例」をご参照ください。
CORS ルールを設定するための API 操作の詳細については、「PutBucketCors」をご参照ください。
CORS ルールを取得するための API 操作の詳細については、「GetBucketCors」をご参照ください。
CORS ルールを削除するための API 操作の詳細については、「DeleteBucketCors」をご参照ください。