【AWS】CloudFrontからOAI/OACを利用してアクセス制限付きのS3からリソースを取得する方法


※ 当ページには【広告/PR】を含む場合があります。
2020/04/21
2024/10/06
【AWS】API GatewayのAPIエンドポイントをカスタムドメイン名を付けてRoute53で公開する基本的な手順
[AWS] 徹底図解!お名前.comで取得したDNSをAWS Route53/Cloudfrontで管理するまでの手順
蛸壺の技術ブログ|AWS CloudFront経由でS3からリソースを取得する設定



これまで個人的な趣向で、AWSのLambdaでRESTfulなAPIの構築しか念頭に入れていなかったので、S3バケットからテキストから画像などありとあらゆるリソースをAPIからGETでリソースをリクエストして、拡張子ごとに適切に中身を処理して…かなり面倒です。
特にリソースが画像の場合は、base64形式でリレーしてあげねばならず、そんな無理にAPIに画像を引張ってきてもらわなくても、CloudFrontから直にS3を連れてきて貰えばいいよね?というのが今回のモチベーションです。
ただ今回の記事のネタは、ネットで“CloudFront S3”で検索していただけたら、設定方法がたくさんヒットします。
割と使い古されているネタですので、あくまで個人の備忘録&復習にどうぞ。


合同会社タコスキングダム|蛸壺の技術ブログ【AWS独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集
図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

簡単なテスト環境準備



とりあえず適当な名前でS3バケットを作成し、jpeg画像(0.jpg)を突っ込んでおきます。
ファイル構造…といえるほど大層なものではないですが、バケットのルートからは以下のように配置しておきます。

            $ tree
.
└── article1
    └── 0.jpg

        

合同会社タコスキングダム|蛸壺の技術ブログ【AWS独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集
図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

CloudFront 側の設定



今回の目標は、ブラウザ等で
http://xxxxxxxxxxxx.cloudfront.net/article1/0.jpg を表示できるようにする事です。
それでは早速、CloudFrontのコンソールに切り替えて、適当なディストリビューションを新規作成してみます。
まずはCloudFrontで新規ディストリビューションを作成します。
350x58
合同会社タコスキングダム|蛸壺の技術ブログ


400x210
合同会社タコスキングダム|蛸壺の技術ブログ


次に、サラのCloudFrontディストリビューションに、前の工程で作ったS3バケットを指定したアクセス制限をかける設定を行います。
ただし、2024年現在で、この記事の当初作成したときに説明していた
「OAI(Origin Access Identity)」 によるアクセス制限が非推奨となり、後継の技術である 「OAC(Origin Access Control)」 の利用を推奨になっています。
とりあえず
OAI もまだ利用できなくなっているわけではないので、 OAC と合わせて以降でその設定方法を説明します。

(旧式のため非推奨)OAIによるアクセス制限の設定



せっかくですので、OAIによるS3バケットのアクセス制限の手順を記録として残しておきます。
実用だけをチェックしたい方は、この節の内容をスキップして、次の「OACによるアクセス制限の設定手順」に進んでください。
まず、
Origin Path には、今回アクセスしたい、S3バケットのオリジンを指定します。
400x225
合同会社タコスキングダム|蛸壺の技術ブログ


次に、以下のように選択肢を設定します。
400x161
合同会社タコスキングダム|蛸壺の技術ブログ


なお、'Grant Read Permission on Bucket'をNoにして、あとでS3のバケットポリシーを手動で設定しても良いのですが面倒な人間はYesにしとくことで、下の写真のように自動で更新してもらえます。
自前のバケットポリシー更新前:
400x201
合同会社タコスキングダム|蛸壺の技術ブログ


CloudFrontの自動書き換え適用後:
450x243
合同会社タコスキングダム|蛸壺の技術ブログ


とりあえず、他の設定項目も多いですが、他はそのまま既定値にしといて、Createボタンをおしてこのディストリビューションを作成します。
作成から体感15分ほどで、'Status'が'Deployed'に変わるまで待ちます。
デプロイ後、サイドメニューから'Origin Access Identity'を覗くと、以下のように先ほど作成したディストリビューションに、新しいオリジンアクセスアイデンティティが発行されていれば成功です。
500x132
合同会社タコスキングダム|蛸壺の技術ブログ


では早速、このディストリビューションのDomain Nameを、ブラウザのアドレスにコピペしてみましょう。
200x13
合同会社タコスキングダム|蛸壺の技術ブログ


すると、CloudFrontのドメインからリソース画像にアクセスできます。
400x250
合同会社タコスキングダム|蛸壺の技術ブログ

OACによるアクセス制限の設定



※この節の内容は2024年10月に追加したものです。
それではOACによるアクセス制限手順のほうも説明していきます。
まずはCFディストリビューションから、
[オリジン] > [オリジンを作成] をクリックします。
738x361
合同会社タコスキングダム|蛸壺の技術ブログ


設定画面に移り、まず
[Origin domain] の項目で制限対象となるS3バケットを選択しましょう。
544x338
合同会社タコスキングダム|蛸壺の技術ブログ


次の設定項目で、
[Origin access control settings (recommended)] をチェックし、 [Create new OAC] ボタンを押すと、OACが発行されます。
710x420
合同会社タコスキングダム|蛸壺の技術ブログ


このOACからバケットポリシーを作るのですが、直下にある
[ポリシーをコピー] ボタンをクリックすると、以下のような自動生成されたポリシーがクリップボードにコピーされます。


            {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::012345678901:distribution/<CFディストリビューションID>"
                }
            }
        }
    ]
}

        

あとは、
[S3バケットアクセス許可に移動] のリンクを踏んで、S3のダッシュボード画面に移り、バケットポリシーをコピーした内容に変更したらOKです。
681x465
合同会社タコスキングダム|蛸壺の技術ブログ



先程の内容と同様に、ディストリビューションのDomain Nameを、ブラウザのアドレスにコピペしてみましょう。
200x13
合同会社タコスキングダム|蛸壺の技術ブログ


すると、CloudFrontのドメインからリソース画像にアクセスできていれば設定完了です。
400x250
合同会社タコスキングダム|蛸壺の技術ブログ

合同会社タコスキングダム|蛸壺の技術ブログ【AWS独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集
図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

HTTPSでアクセスする



上の設定まででCloudFrontから十分アクセス可能ですが、できればSSL対応して使いたいです。 そんな時に、デストリビューションのBehavior タグを以下のように編集してみます。
350x88
合同会社タコスキングダム|蛸壺の技術ブログ


そして再デプロイ後に、アクセスを試みると、
400x234
合同会社タコスキングダム|蛸壺の技術ブログ


キチンとhttpsでアクセスできていることがわかります。


合同会社タコスキングダム|蛸壺の技術ブログ【AWS独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集
図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

まとめ



以上、CloudFrontとS3からファイルを取得する基本を簡単にまとめてみました。
おそらくAWS初学者が学習の最初に構築してみる代表的なマイクロサービスパターンの一つですので、ダッシュボードでの設定方法を確実に身につけましょう。

参考

オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する特定バケットに特定ディストリビューションのみからアクセスできるよう設定するCDP:Cache Distributionパターン
記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。

合同会社タコスキングダム|蛸壺の技術ブログ【AWS独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集