プログラミング備忘録

仕事で覚えたことのまとめ

AWSコンテンツへのアクセスを限定開放する黒田如水の画像下さい!!!!(3)CloudFrontでマルチオリジンを設定する

あらすじ

黒田家のAWSのS3にあるファイルやAPIを特定の相手のみが利用できる形で公開するために、CloudFrontを使ってみよう。 だって、亡き友竹中半兵衛重治が言い残したのだから...(エモポイント)

前回CloudFrontのDistributionを作った黒田如水は、今回一つのDistributionから複数のコンテンツへアクセスできるよう設定する。

CloudFrontとは

S3やAPIAWSのアカウントを持っていない人でも、条件に合致するならアクセスできるようにする、という仕組みです。 もしくはWeb上のアクセスの関所。

Distributionとは

DistributionはCloudFront上に置かれた関所一つ一つになります。 この関所を通過することで、バケットポリシーやリソースポリシー上はアクセスをブロックしていたとしても、コンテンツを配布することが可能です。

DistributionOriginをさらに追加する(マルチオリジンを設定する) v20210531

AWSコンソールでCloudFrontを開き、対象のDistributionのIDをクリックし、画面上部のタブからOrigins and Origin Groupsをクリックします。

f:id:nigou2:20210710164608p:plain

表示される画面からCreate Originをクリックします。

OriginAPI Gatewayを追加設定する場合(APIのマルチオリジン)

Origin Domain Nameに、APIのステージを除いたエンドポイントのURLを入力します。 この時、Origin Pathは空白にします。 Minimum Origin SSL ProtocolTLSv1.2Origin Protocol PolicyHTTPS Onlyにします。

f:id:nigou2:20210710164813p:plain

ここまで出来たら右下のCreateを押します。

このオリジンにアクセスを分岐させるために、Behaviorsを更新します。 画面上部のタブからBehaviorの編集画面に移動し、Create Behaviorを押します。 f:id:nigou2:20210710164906p:plain

Path Groupに、先ほどのAPIのステージを入れ、/*をつなげます。 Origin and Origin Groupは先ほど設定したオリジンを、 Viewer Protocol PolicyHTTP and HTTPSを入力します。 このCloudFrontを通して実行を許可させるAPIのメソッドに対応して、 Allowed HTTP Methodsも変更します。(迷ったら3つ目のものでOK)

f:id:nigou2:20210710165043p:plain

以上を設定したら右下のCreateを押します。

補足

考え方としては

Cloud Frontのドメイン => ステージを除いたエンドポイントURL Behavior       => ステージ名

のような対応になります。

OriginにS3バケットを追加設定する場合(S3のマルチオリジン)

前提として、以下のような構造のバケットをマルチオリジンにします。 バケット直下にCloudFrontを経由して配信したいファイルをまとめておくフォルダを作成します。

S3
┣ myBucket -バケット-
┃    ┣ test.png                   -画像A-
┃  ┗ s3test
┃    ┣ test.png        -画像B-
┃      ┗  test2.png
┗ ...

Originを追加します。この時、Origin Pathは空白にします。 f:id:nigou2:20210710165321p:plain

Behaviorを追加します。この時、Path Patternに、Originに指定したバケットのフォルダオブジェクトの名前を入力します。

f:id:nigou2:20210710165349p:plain

以上を設定したら右下の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バケットをマルチオリジンを設定する場合、配信コンテンツの入っているフォルダ名は、バケットをまたいで重複できない、ということになります。

ここまででできたこと

リクエスト内容に応じて対応するコンテンツを配信する仕組み (関所を通らなければ辿り着けない場所の追加)

やらないといけないこと

アクセス制限のルールの設定 (関所の門番を働かせる)

f:id:nigou2:20210710165439p:plain

f:id:nigou2:20210710165451p:plain

流石「今世の張良」とうたわれた名軍師、黒田如水。 複数コンテンツのアクセス時に通過する場所がCloudFrontに集まっていることの利便性を理解している・・・

次は作ったDistributionにアクセスルールを紐づける工程になります