AWSコンテンツへのアクセスを限定開放する黒田如水の画像下さい!!!!(3)CloudFrontでマルチオリジンを設定する
あらすじ
黒田家のAWSのS3にあるファイルやAPIを特定の相手のみが利用できる形で公開するために、CloudFrontを使ってみよう。 だって、亡き友竹中半兵衛重治が言い残したのだから...(エモポイント)
前回CloudFrontのDistributionを作った黒田如水は、今回一つのDistributionから複数のコンテンツへアクセスできるよう設定する。
CloudFrontとは
S3やAPIをAWSのアカウントを持っていない人でも、条件に合致するならアクセスできるようにする、という仕組みです。 もしくはWeb上のアクセスの関所。
Distribution
とは
Distribution
はCloudFront上に置かれた関所一つ一つになります。
この関所を通過することで、バケットポリシーやリソースポリシー上はアクセスをブロックしていたとしても、コンテンツを配布することが可能です。
Distribution
にOrigin
をさらに追加する(マルチオリジンを設定する) v20210531
AWSコンソールでCloudFrontを開き、対象のDistribution
のIDをクリックし、画面上部のタブからOrigins and Origin Groups
をクリックします。
表示される画面からCreate Origin
をクリックします。
Origin
にAPI Gatewayを追加設定する場合(APIのマルチオリジン)
Origin Domain Name
に、APIのステージを除いたエンドポイントのURLを入力します。
この時、Origin Path
は空白にします。
Minimum Origin SSL Protocol
はTLSv1.2
、
Origin Protocol Policy
はHTTPS Only
にします。
ここまで出来たら右下のCreate
を押します。
このオリジンにアクセスを分岐させるために、Behaviors
を更新します。
画面上部のタブからBehavior
の編集画面に移動し、Create Behavior
を押します。
Path Group
に、先ほどのAPIのステージを入れ、/*
をつなげます。
Origin and Origin Group
は先ほど設定したオリジンを、
Viewer Protocol Policy
はHTTP and HTTPS
を入力します。
このCloudFrontを通して実行を許可させるAPIのメソッドに対応して、
Allowed HTTP Methods
も変更します。(迷ったら3つ目のものでOK)
以上を設定したら右下のCreate
を押します。
補足
考え方としては
Cloud Frontのドメイン => ステージを除いたエンドポイントURL Behavior => ステージ名
のような対応になります。
Origin
にS3バケットを追加設定する場合(S3のマルチオリジン)
前提として、以下のような構造のバケットをマルチオリジンにします。 バケット直下にCloudFrontを経由して配信したいファイルをまとめておくフォルダを作成します。
S3 ┣ myBucket -バケット- ┃ ┣ test.png -画像A- ┃ ┗ s3test ┃ ┣ test.png -画像B- ┃ ┗ test2.png ┗ ...
Origin
を追加します。この時、Origin Path
は空白にします。
Behavior
を追加します。この時、Path Pattern
に、Origin
に指定したバケットのフォルダオブジェクトの名前を入力します。
以上を設定したら右下のCreate
を押します。
補足
バケットの中のコンテンツにたどり着くまでの手順の考え方ですが、
Origin
の振り分けに使用されたPathPattern
は無視されず、リクエストに残ります。
振り分けとオリジンの取得の結果、
HTTPリクエストのCloud_Front_Domain / Behavior_PathPattern / test.png
が
cloudfront-to-s3-test-aoki/ Behavior PathPattern / test.png
に替わるので、
cloudfront-to-s3-test-aoki
直下のtest.png(画像A)を取得するのではなく、
Behavior_PathPattern
と一致するフォルダの中のtest.png(画像B)を取得します。
Origin Path
を空白にしている理由は、このリクエストの考え方が一層ややこしくなるからです。
逆に言えば、複数のS3バケットをマルチオリジンを設定する場合、配信コンテンツの入っているフォルダ名は、バケットをまたいで重複できない、ということになります。
ここまででできたこと
リクエスト内容に応じて対応するコンテンツを配信する仕組み (関所を通らなければ辿り着けない場所の追加)
やらないといけないこと
アクセス制限のルールの設定 (関所の門番を働かせる)
流石「今世の張良」とうたわれた名軍師、黒田如水。
複数コンテンツのアクセス時に通過する場所がCloudFront
に集まっていることの利便性を理解している・・・