[アップデート] Amazon S3でいくつかのHTTPエラーコードに対して課金されなくなりました

認証されていない外部からのリクエストに対する課金の恐怖から解放されました
2024.05.14

外部からS3バケットに対するアクセスエラー時の課金が気になる

こんにちは、のんピ(@non____97)です。

皆さんは外部からS3バケットに対するアクセスエラー時の課金が気になったことはありますか? 私はあります。

Amazon S3ではAPIリクエスト数に応じて課金が発生します。

  • PUT、COPY、POST、LIST リクエスト (1,000 リクエストあたり) : 0.0047USD
  • GET、SELECT、他のすべてのリクエスト (1,000 リクエストあたり) : 0.00037USD

※ いずれも東京リージョンのS3 Standardの場合

抜粋 : 料金 - Amazon S3 |AWS

レスポンスステータスコードによって課金発生の判定は行われません。

その結果、以下記事で紹介しているとおり、外部から大量のアクセスがあり全て403 AccessDeniedであってもリクエスト数分の課金が発生します。

こちらの記事の大量の課金が発生 = 大量のPUTリクエストが発生した原因は「人気の高いオープンソースツールがバックアップをS3に保存する際のデフォルト構成のプレースホルダーがS3バケット名と一致していたため」とのことでした。

パブリックブロックアクセスを有効にしていたとしても、S3バケットの名前が被っていただけで約1億件のPUTリクエストが来るのは怖いですね。

これを悪用することで、S3バケット名が明らかになっている場合、悪意のある第三者が大量にそのS3バケットにHTTPリクエストをすることで、意図的に利用料金を肥大化させることが可能です。EDoSと言って良いと思います。

今回アップデートによりAmazon S3でいくつかのHTTPエラーコードに対して課金されなくなりました。

これにより先ほどの問題から解放されそうです。やったぜ。

ということで、どのHTTPエラーコードに対して課金が発生しなくなったのか確認してみました。

いきなりまとめ

  • 請求されないHTTPエラーコードは以下
    • 5XX
    • 一部3XX
    • 一部4XX
  • 403 AccessDeniedは無条件で課金されなくなったのではなく、「バケット所有者のAWSアカウントまたはバケット所有者のAWS Organizations以外からのリクエストの場合にはS3はバケット所有者に課金しない」と条件がある
    • S3バケット名が明らかになったとしても、第三者からのリクエストが403 AccessDeniedになれば課金は発生しない
    • 同一AWSアカウント内で発生した403 AccessDeniedについては引き続き課金対象
  • カスタムエラードキュメントやカスタムリダイレクトをする場合は該当するリクエスト分の課金が発生する
  • 全リージョンでアップデート内容が適用されるまでは数週間かかる

請求されなくなったHTTPレスポンスの確認

請求されなくなったHTTPレスポンスの確認をします。

対象は以下AWS公式ドキュメントにまとまっています。

抜粋すると以下のとおりです。

HTTP status code Error code
301 Moved Permanently PermanentRedirect
PermanentRedirectControlError
307 Temporary Redirect TemporaryRedirect
400 Bad Request AuthorizationHeaderMalformed
AuthorizationQueryParametersError
ExpiredToken
IllegalLocationConstraintException
InvalidArgument
InvalidDigest
InvalidEncryptionAlgorithmError
InvalidRequest
InvalidSOAPRequest
InvalidStorageClass
InvalidTag
InvalidToken
InvalidURI
KeyTooLongError
MalformedACLError
MalformedPOSTRequest
MalformedXML
MaxPostPreDataLengthExceededError
MetadataTooLarge
MissingRequestBodyError
MissingSecurityHeader
NoLoggingStatusForKey
RequestHeaderSectionTooLarge
UnexpectedContent
UserKeyMustBeSpecified
IncorrectEndpoint
403 Forbidden RequestTimeTooSkewed
SignatureDoesNotMatch
NotSignedUp
InvalidSecurity
InvalidPayer
InvalidAccessKeyId
AccountProblem
UnauthorizedAccessError
404 Not Found NoSuchUpload
NoSuchWebsiteConfiguration
405 Method Not Allowed MethodNotAllowed
409 Conflict BucketAlreadyExists
InvalidBucketState
OperationAborted
411 Length Required MissingContentLength
412 Precondition Failed RequestIsNotMultiPartContent

きっかけとなった403 AccessDeniedは含まれていませんね。

403 AccessDeniedは無条件で課金されなくなったのではなく、「バケット所有者のAWSアカウントまたはバケット所有者のAWS Organizations以外からのリクエストの場合にはS3はバケット所有者に課金しない」と条件があります。

Note

For AccessDenied (HTTP 403 Forbidden), S3 doesn't charge the bucket owner when the request is initiated outside of the bucket owner's individual AWS account or the bucket owner's AWS organization.

Billing for Amazon S3 error responses - Amazon Simple Storage Service

そのため、認証していない状態で、以下のようなコマンドで任意のS3バケットにPUTして403 AccessDeniedとなっても課金されなくなりました。これにより上述の記事のような事象は発生しなくなったと考えます。

$ aws s3 cp ./file.txt s3://<S3バケット名>/file.txt

一方、同一AWSアカウント内で発生した403 AccessDeniedについては引き続き課金対象なので注意しましょう。

その他の注意点として、カスタムエラードキュメントやカスタムリダイレクトをする場合は該当するリクエスト分の課金が発生します。

For buckets configured with website hosting, applicable request and other charges will still apply when S3 returns a custom error document or for custom redirects.

Billing for Amazon S3 error responses - Amazon Simple Storage Service

S3静的Webサイトホスティングをしている場合は注意です。

全リージョンでアップデート内容が適用されるまでは数週間かかる

Jeff Barr氏曰く、It will take a few weeks for the roll out to complete in all #AWS Regions.とのことで、全てのAWSリージョンで適用が完了するまでは数週間かかる想定のようです。今すぐ検証すると事故するかもしれません。課金が怖いので検証は控えておきます。

AWS公式ドキュメントにも「5/13からデプロイを開始した。全てのAWSリージョンで適用が完了したらドキュメントを更新する。」と記載されています。

Important

On May 13, 2024, we started deploying a change to eliminate charges for unauthorized requests that aren't initiated by the bucket owner. After the deployment of this change is completed, bucket owners will never incur request or bandwidth charges for requests that return AccessDenied (HTTP 403 Forbidden) errors when these requests are initiated from outside of their individual AWS account or AWS organization. The current page shows a full list of HTTP 3XX and 4XX status codes that won't be billed. This billing change requires no updates to your applications and applies to all S3 buckets. When deployment of this change is completed in all AWS Regions, we’ll update our documentation.

Billing for Amazon S3 error responses - Amazon Simple Storage Service

認証されていない外部からのリクエストに対する課金の恐怖から解放されました

Amazon S3でいくつかのHTTPエラーコードに対して課金されなくなったアップデートを紹介しました。

認証されていない外部からのリクエストに対する課金の恐怖から解放されましたね。上述の記事が投稿されてから2週間ほどで対応できるAWS、すごいです。

ちなみに、S3が返す全てのエラーコードは以下AWS公式ドキュメントにまとまっています。気になる方はご覧ください。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!