フューチャー技術ブログ

AWS S3をIP制限付きのファイルダウンロードリンクにする

TIGの伊藤真彦です。

S3としてお馴染みの、Amazon Simple Storage Serviceは皆さんご存じだと思います。「シンプル」の命名とは裏腹に、静的サイトホスティングをS3で行ったりといった様々な利用形態が存在します。

また、アセットファイルの配置場所やSSL通信の証明書ストアとして何らかのサービスと組み合わせるような利用形態が多いサービスではないでしょうか。そんなS3を極々シンプルなファイル配布装置として使うノウハウは一周回って無くなっているな、と感じました。

つまりブラウザで任意のURLにアクセスすると、zipファイル等配布物をダウンロードできるような状態にすることが本記事で説明している内容です。

S3バケットを作成する

まずは基本的なおさらいとして、S3バケットの作り方から説明します。

AWSコンソールにログインし、サービスからS3を選択します。

バケットを作成をクリックし、任意の名称のS3バケットを作成します。
今回はsample-downloadにしました。
リージョンは何でもよいですがアジアパシフィック (東京) ap-northeast-1を選択するのが定番ですね。

そのままバケットを作成ボタンをクリックして、デフォルト設定のバケットを作成できます。

S3バケットにファイルをアップロードする

作成したバケット名をクリックすることでS3の設定、ファイルの管理を行うメニューが表示されます。

アップロードボタンでファイルをアップロードできます。
今回は試しにS3のアイコン画像をzipに圧縮したものをアップロードしてみます。

ファイルを追加、もしくはドラッグ&ドロップでアップロードできます。

ストレージクラスの選択やサーバーサイド暗号化など選択項目がありますが、動作させる分にはデフォルト値で問題ありません。

強いて言うならバケットのバージョニングに関する同意にチェックをつけないとアップロードボタンを押してもエラーが表示されることが注意点です。

アップロードボタンをクリックでファイルのアップロードは完了です。

アップロードしたファイルをダウンロード可能にする

バケットの設定トップに戻ると先ほどのzipファイルが確認できます。

ファイル名をクリックするとオブジェクトURLが確認できます。
しかし、このままではオブジェクトURLにブラウザでアクセスしてもzipファイルをダウンロードすることはできません。

上記画像のようなエラーが表示されます。

バケットの設定でパブリックアクセスを許可する必要があります。

設定画面のアクセス許可から、パブリックアクセスのブロックを解除します。

編集するをクリックし、「パブリックアクセスを全てブロック」のチェックを解除します。

この状態でアップロードしたzipファイルを確認すると、公開するボタンが押せるようになっています。

公開ボタンをクリックしてから、オブジェクトURLにブラウザでアクセスすると、ファイルをダウンロードできるようになっています。

アップロードしたファイルにIP制限をかける

さてこのままでは世界中のどこからアクセスしてもファイルをダウンロードできてしまいます。業務的にはIP制限である程度クローズドな状態にすることが求められると思います。そのような場合はバケットポリシーでIP制限をかけることが可能です。

S3バケットの設定画面の、アクセス制限から、バケットポリシーを編集できます。
編集するボタンをクリックし、下記のようなポリシーを設定します。

{
"Version": "2012-10-17",
"Id": "Policy20201101",
"Statement": [
{
"Sid": "sampleS3ip",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"許可するIPアドレス"
]
}
}
}
]
}

バケットポリシーのIDは何でも良いですが、迷ったらポリシージェネレーターを利用すると良いでしょう。

このように設定しました。

ここで大事なことは、"Resource"に記載するS3バケットのarnの末尾に/*を記載、もしくはオブジェクトのパスを明記することです。上記のような書き方をしない場合、配置したzipファイルにはバケットポリシーが反映されず、変わらず許可していないIPアドレスでもダウンロードできる状態になってしまいます。

唯一のハマりどころと言っても過言ではなく、この記事で一番言いたいことはここです。

この状態で自分のIPアドレスを許可するIPに含めないと、オブジェクトURLにブラウザでアクセスしても上記画像のような状態になります。

なお一度IPアドレス許可に含めてから、検証のため再度許可するIPアドレスから外すと、キャッシュが残るのかしばらくはダウンロードできる場合があります。
別ブラウザやGoogle Chromeのシークレットウィンドウなどで挙動を確認すると良いでしょう。

まとめ

  • S3バケットでファイルのダウンロードをする為にはパブリックアクセスを許可する
  • IP制限はバケットポリシーで行う

単純な事ではありますが、単純故にこのようなユースケースでの案内が無いなと感じる部分でした、誰かのお役に立てば幸いです。