[アップデート] Amazon Lightsail のバケットに Cross-Origin Resource Sharing (CORS) を設定できるようになりました
いわさです。
Aamzon Lightsail では仮想プライベートサーバーをメインで提供するサービスですが、ロードバランサーやデータベース、ストレージなどの様々なオプションサービスも提供しています。
その中にオブジェクトストレージである「バケット」があります。
バケットは様々な用途で利用できますが、ウェブシステムなどで利用する際の静的コンテンツ配信元として利用することも出来ます。
実はこれまで Amazon Lightsail のバケットでは CORS に未対応で、Lightsail CDN ディストリビューション経由でのみ CORS 周りにどうにか対応することが出来ていました。[1]
これは Lightsial のバケットを使用する際の注意事項だったのですが、先日のアップデートで CORS 設定ができるようになりました。
おそらく公式の AWS アップデートアナウンスは出ていなさそうですが、公式ドキュメントの更新履歴を確認してみると次のように 10/15 に更新されているようです。
Document history for Amazon Lightsail - Amazon Lightsail より
今回バケットに CORS を設定する流れや動作の確認をしてみましたので紹介します。
デフォルトの状態
まずはバケットを作成してみましょう。
Amazon Lightsail コンソールのストレージメニューからバケットを選択します。
今回のアップデートのポイントなのですが、Lightsail コンソールからバケットを作成するときに、特に CORS を設定できそうな箇所は見当たりません。
また作成後のバケット設定を確認しても同様dえ、CORS はコンソール上から設定が出来ません。
今回のアップデートでは AWS API からのみ CORS の設定が出来るようになっています。
また、バケット情報を取得するget-buckets
でも CORS 情報を含めるオプションが追加され、確認が出来るようになっています。(v1.42.53 以上)
まずは先程コンソールから作成したバケットの情報を確認してみます。
% aws lightsail get-buckets --bucket-name bucket-5hmuyg --profile hoge
{
"buckets": [
{
"resourceType": "Bucket",
"accessRules": {
"getObject": "private",
"allowPublicOverrides": false
},
"arn": "arn:aws:lightsail:ap-northeast-1:123456789012:Bucket/c5317deb-43f8-45a0-9871-e1efe924378e",
"bundleId": "small_1_0",
"createdAt": "2025-10-19T17:01:12.218000+09:00",
"url": "https://bucket-5hmuyg.s3.ap-northeast-1.amazonaws.com",
"location": {
"availabilityZone": "all",
"regionName": "ap-northeast-1"
},
"name": "bucket-5hmuyg",
"supportCode": "173033923990/bucket-5hmuyg/small_1_0",
"tags": [],
"objectVersioning": "NeverEnabled",
"ableToUpdateBundle": true,
"readonlyAccessAccounts": [],
"state": {
"code": "OK"
},
"accessLogConfig": {
"enabled": false
}
}
],
"accountLevelBpaSync": {
"status": "InSync",
"lastSyncedAt": "2025-10-20T05:10:39+09:00",
"message": "",
"bpaImpactsLightsail": false
}
}
特にオプションを指定しなかった場合は、上記のようにレスポンスに CORS に関する情報は特に含まれていません。
今回のアップデートで--include-cors
が追加されているのでこちらを指定してみましょう。
% aws lightsail get-buckets --bucket-name bucket-5hmuyg --profile hoge --include-cors
{
"buckets": [
{
"resourceType": "Bucket",
"accessRules": {
"getObject": "private",
"allowPublicOverrides": false
},
"arn": "arn:aws:lightsail:ap-northeast-1:123456789012:Bucket/c5317deb-43f8-45a0-9871-e1efe924378e",
"bundleId": "small_1_0",
"createdAt": "2025-10-19T17:01:12.218000+09:00",
"url": "https://bucket-5hmuyg.s3.ap-northeast-1.amazonaws.com",
"location": {
"availabilityZone": "all",
"regionName": "ap-northeast-1"
},
"name": "bucket-5hmuyg",
"supportCode": "173033923990/bucket-5hmuyg/small_1_0",
"tags": [],
"objectVersioning": "NeverEnabled",
"ableToUpdateBundle": true,
"readonlyAccessAccounts": [],
"state": {
"code": "OK"
},
"accessLogConfig": {
"enabled": false
},
"cors": {}
}
],
"accountLevelBpaSync": {
"status": "InSync",
"lastSyncedAt": "2025-10-20T05:10:39+09:00",
"message": "",
"bpaImpactsLightsail": false
}
}
デフォルトでは未設定ではあるのですが、レスポンスに CORS 情報が含まれるようになったことが確認出来ます。
このように、コンソールでデフォルト作成したバケットには CORS 設定が何もされていない状態になります。
試しに OPTIONS リクエストを送信してみます。
% curl -H "Origin: https://example.com" \
-H "Access-Control-Request-Method: GET" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS \
https://bucket-5hmuyg.s3.ap-northeast-1.amazonaws.com/hoge.html
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessForbidden</Code><Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message><Method>GET</Method><ResourceType>OBJECT</ResourceType><RequestId>8XB0713A8S86PNHE</RequestId><HostId>vd8qt1g/ouQt1whYBXE+Fh1SWSQAmxsHdrFC6NksK410tbFYQ6opaLgIrLay6z0mKqi89dZnfTI=</HostId></Error>%
CORS エラーで拒否されましたね。
これまでの Lightsail バケットではこのように CORS 対応することが出来ませんでした。
CORS を設定
先程お伝えしたように今回のアップデートで AWS API 経由でバケットに CORS 設定が出来るようになっていますのでやってみましょう。
update-bucket
コマンドでcors
パラメータを設定するのですが、最大20個のルールを追加することができます。制限事項として合計サイズを 64 KB 以下にする必要があります。
ひとつ以上のオリジンとメソッドの指定が必須になっています。他にもいくつかオプションで設定可能な項目もあるのですが、詳しくは上記コマンドリファレンスをご確認ください。
% cat hoge.json
{
"bucketName": "bucket-5hmuyg",
"cors": {
"rules": [
{
"allowedMethods": [
"GET",
"POST",
"PUT",
"DELETE",
"HEAD"
],
"allowedOrigins": [
"*"
],
"allowedHeaders": [
"*"
],
"maxAgeSeconds": 3000
}
]
}
}
% aws lightsail update-bucket --cli-input-json file://hoge.json --profile hoge
{
"bucket": {
"resourceType": "Bucket",
"accessRules": {
"getObject": "public",
"allowPublicOverrides": false
},
"arn": "arn:aws:lightsail:ap-northeast-1:123456789012:Bucket/c5317deb-43f8-45a0-9871-e1efe924378e",
"bundleId": "small_1_0",
"createdAt": "2025-10-19T17:01:12.218000+09:00",
"url": "https://bucket-5hmuyg.s3.ap-northeast-1.amazonaws.com",
"location": {
"availabilityZone": "all",
"regionName": "ap-northeast-1"
},
"name": "bucket-5hmuyg",
"supportCode": "173033923990/bucket-5hmuyg/small_1_0",
"tags": [],
"objectVersioning": "NeverEnabled",
"ableToUpdateBundle": true,
"readonlyAccessAccounts": [],
"state": {
"code": "OK"
},
"accessLogConfig": {
"enabled": false
},
"cors": {
"rules": [
{
"allowedMethods": [
"GET",
"POST",
"PUT",
"DELETE",
"HEAD"
],
"allowedOrigins": [
"*"
],
"allowedHeaders": [
"*"
],
"maxAgeSeconds": 3000
}
]
}
},
"operations": [
{
"id": "c55a9c5b-f1aa-4655-8a28-e42642e6b31a",
"resourceName": "bucket-5hmuyg",
"resourceType": "Bucket",
"createdAt": "2025-10-20T05:42:46.474000+09:00",
"location": {
"availabilityZone": "all",
"regionName": "ap-northeast-1"
},
"isTerminal": true,
"operationDetails": "173033923990/bucket-5hmuyg/small_1_0",
"operationType": "UpdateBucket",
"status": "Succeeded",
"statusChangedAt": "2025-10-20T05:42:46.474000+09:00",
"errorCode": "",
"errorDetails": ""
}
]
}
設定できたみたいですね。
cURL でリクエストを送信してみましょう。
% curl -I https://bucket-5hmuyg.s3.ap-northeast-1.amazonaws.com/hoge.html -H "Origin: https://example.com" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: X-Hoge-Header" -X OPTIONS
HTTP/1.1 200 OK
x-amz-id-2: 3u4JXRGeoSRkCT/6qUz3H2HArg3yYHuJzkRyj98Cu66AITODODJraB/gW8ea82Wlh5vWX31O+sRoA2pdnferO4UuDM1Ge9bDnIjzdo0l9IU=
x-amz-request-id: XREJ1JCR4YARHKAJ
Date: Sun, 19 Oct 2025 20:47:05 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, HEAD
Access-Control-Allow-Headers: x-hoge-header
Access-Control-Max-Age: 3000
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Content-Length: 0
Server: AmazonS3
今度は正常にレスポンスを取得することが出来ました。
正しく CORS 設定できていそうですね。
CORS 設定を削除する
CORS 設定はcreate-bucket
とupdate-bucket
で行います。
削除の場合も同様で、cors
パラメータに空のルールを設定する形になります。
% cat hoge.json
{
"bucketName": "bucket-5hmuyg",
"cors": {
"rules": []
}
}
% aws lightsail update-bucket --cli-input-json file://hoge.json --profile hoge
{
"bucket": {
"resourceType": "Bucket",
"accessRules": {
"getObject": "public",
"allowPublicOverrides": false
},
"arn": "arn:aws:lightsail:ap-northeast-1:123456789012:Bucket/c5317deb-43f8-45a0-9871-e1efe924378e",
"bundleId": "small_1_0",
"createdAt": "2025-10-19T17:01:12.218000+09:00",
"url": "https://bucket-5hmuyg.s3.ap-northeast-1.amazonaws.com",
"location": {
"availabilityZone": "all",
"regionName": "ap-northeast-1"
},
"name": "bucket-5hmuyg",
"supportCode": "173033923990/bucket-5hmuyg/small_1_0",
"tags": [],
"objectVersioning": "NeverEnabled",
"ableToUpdateBundle": true,
"readonlyAccessAccounts": [],
"state": {
"code": "OK"
},
"accessLogConfig": {
"enabled": false
},
"cors": {}
},
"operations": [
{
"id": "874c1bd1-1a4e-4a2e-aee7-aad05eeb7508",
"resourceName": "bucket-5hmuyg",
"resourceType": "Bucket",
"createdAt": "2025-10-20T05:47:37.168000+09:00",
"location": {
"availabilityZone": "all",
"regionName": "ap-northeast-1"
},
"isTerminal": true,
"operationDetails": "173033923990/bucket-5hmuyg/small_1_0",
"operationType": "UpdateBucket",
"status": "Succeeded",
"statusChangedAt": "2025-10-20T05:47:37.168000+09:00",
"errorCode": "",
"errorDetails": ""
}
]
}
上記で CORS 設定を削除後に再度リクエストを送信してみると、403 エラーになっていることが確認出来ますね。
% curl -I https://bucket-5hmuyg.s3.ap-northeast-1.amazonaws.com/hoge.html -H "Origin: https://example.com" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: X-Hoge-Header" -X OPTIONS
HTTP/1.1 403 Forbidden
x-amz-request-id: KYXPQK5CVDY8GHPD
x-amz-id-2: Tdxlw5Qh6l27bPcGxWijk+tdYtTsG/CQIWlhRhyACVNFLvyb5LK6q9X7szMT93uPjcbaigjPwNvyEdDdyWz54U0vtJTU22qrj7E7jet1mBk=
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Sun, 19 Oct 2025 20:48:05 GMT
Server: AmazonS3
さいごに
本日は Amazon Lightsail のバケットに Cross-Origin Resource Sharing (CORS) を設定できるようになったので試してみました。
私自身は Lightsail バケットの CORS に悩まされる経験は無かったのですが、たまに話しを聞いたことはありましたね。
今後はバケットに直接 CORS 設定が可能になったので、今後使う機会のある方はぜひ試してみてください。