LoginSignup
0
0

Amazon CloudFront

Posted at

内容
・趣旨目標
・公式サイト
・使用できるサービス
・目指す構成
・環境
・S3バケットから作成
・CloudFrontを作成
・S3バケットポリシーを編集(CloudFrontと接続)キャッシュ無し。
・カスタムポリシーを作成して、キャッシュさせる設定
・Lambdaを作成
・APIを作成
・LambdaとAPIの関連付け設定
・動的コンテンツを配信
・AWS WAFを設定
・リソースの削除

趣旨目標

手を動かして学習します。SAA試験対策になればなお良し|д゚)

公式サイト:

使用できるサービス:

Amazon CloudFront,AWS WAF

目指す構成

image.png

環境

バージニア北部、IAMユーザーで作業します。(ハンズオンの通り。)

S3バケットから作成

image.png
image.png
他はデフォルト
image.png

静的コンテンツをアップロード(公式作成データ「fors3」)
フォルダごとイン!そしてアップロード。
image.png
image.png

CloudFrontを作成

image.png
※UIが少しだけ古いので慎重にいきます。

・最初にオリジンとしてS3を指定する(ドロップダウン)。
image.png

・バケットにアクセスする方法をOAI(現OAC)によって接続する設定を行う。
赤枠ドロップダウンから選択(入力必須です。)。
Create new OACをクリック。
image.png

※OACとは:
https://aws.amazon.com/jp/blogs/news/amazon-cloudfront-introduces-origin-access-control-oac/
要するに、OAIよりOACの方がセキュアです。ということ。
これまでは、S3自身で暗号化していた場合、OAIで接続することができなかったが、現状ではS3側で暗号化された状態でも接続することができる!私が調べた結果なので参考までに(^^;
「OAC」を選択しましょう。

image.png
この署名は「SigV4」というaws独自のプロトコルでアクセスキーとシークレットキーを使用して相手を認証するものですね。Front側からS3側にデータを送った時の認証用ですね!これは処理上、署名リクエストにチェックを入れましょう。処理速度に影響するとのことです。
なお、”上書きしない”サブオプションは基本使わなそうですね読んだ感じ。
Createをクリック。

↓公式さんサイトにここの説明がないっす(泣)ひとまずタイムアウトとか、ヘッダーを追加することで更にセキュアになるということかな
image.png

続いてビヘイビア(振る舞い)を設定
ここでHTTPSからの接続としたいので、HTTPはHTTPSにリダイレクトします。
image.png
image.png

※ここではわざと次のとおり、キャッシュしない設定にしています。

後ほどキャッシュしていないことを確認する学習をするために、デフォルトでは真っ当な設定になっていますが、わざと設定を行っています。
image.png

ログ取ったり、「フィールドレベルの暗号化」でもっとセキュアにできるのですねー。
image.png

ここでLambdaによって動きを付けられるみたいですね。
image.png

現状のCloudFrontにおいてAWS WAFが設定できちゃうのですね!水際対策!
(ハンズオンに従いスルーします。)
image.png

ここでどの範囲のエッジロケーションを含めるか決めて、料金が決まりますね。
恐ろしい|д゚)
また、ドメインの指定や、証明書も発行(ACM)できちゃいますね。
image.png

次の「デフォルトルートオブジェクト - オプション」はデフォルトで見せたいページを表示させるオプション。気が利きますね!
image.png

今までで一番やかましい(笑)
image.png
黄色いポップアップに従い、「ポリシーをコピー」し、リンクから設定を行う。

S3バケットポリシーを編集(CloudFrontと接続)

image.png
image.png
先程、コピーしたポリシーをペーストして変更を保存します。
image.png
image.png

これでCloudFrontからS3に接続できるはずですので、CloudFrontに移動します。

接続確認と、自身のブラウザのキャッシュ機能を停止させる作業を行います。
ディストリビューションをクリックし、「ドメイン名」をコピーして新しいタブをさらに開き、貼り付けます。
image.png
すると左側のように先程設定したindex.htmlが表示されるので、「F12」でデベロッパーツールを表示させ、「Network」の「Disable cache」にチェックを入れます。

※ハンズオンが終わったらデベロッパーツールの設定を元に戻します。

続いて、Networkの画面で「F5」を押下して画面更新する。すると「cloudfront」という項目があるので、選択してX-cache:欄を確認するとMissとなっており、CloudFrontは現在キャッシュできていないことがわかります。
image.png
このブラウザは開きっぱなしで
次に進みます。

現状これ↓
image.png

CloudFrontにキャッシュを持たせる設定に修正していき検証
CloudFrontに移動し、ポリシーから先程自分で設定した「Caching Disabled」を選択。
image.png

現状次のようにTTL(時間がきたら捨てる設定)の値がブランクになっており、キャッシュされない設定になっているのが確認できる。
image.png

カスタムポリシーを作成して、キャッシュさせる設定

image.png

最低1秒で削除、デフォルトは86400秒(1日)キャッシュしてくれて、最大31536000秒(1年)キャッシュする設定。
image.png

表記のとおりのキャッシュので設定であると、URLとパスを組み合わせてキャッシュし、逆に「ALL」を選択した場合は、キャッシュ率という指標が低下してしまい、その分オリジンに負荷がかかってしまう設定となる。
image.png

デフォルト
image.png
image.png
image.png

次はCloudFrontに反映させる。
image.png
image.png

振る舞い(ビヘイビア)を作成
パスパターンとは:
・公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesPathPattern
・公式AWS Black Belt Online Seminar資料
https://d1.awsstatic.com/webinars/jp/pdf/services/20201028_BlackBelt_Amazon_CloudFront_deep_dive.pdf
公式さんの資料をお借りし、私的に超要約すると、「TTLを細かく設定するためにパスパターンを決める。」といったところでしょうか。公式、ブログなどを散策しましたが、全てのパスパターンが記載されているサイトを見つけることができませんでした。皆さん検証して確かめている状態ですね。
また、今回設定する「/static/*」は、恐らく「直接接続しているS3を指すもの。」と勝手に解釈しています|д゚)
image.png

image.png
image.png
デフォルトのキャッシュ設定ではなく、今作成したポリシーを当てます。
image.png
image.png
image.png
image.png
次の画像で今作成した振る舞いが追加されていることに併せて、上から順にポリシーが適用される設定になっています。
image.png

検証していきます。
こちらに戻ります。ブラウザにディストリビューションのドメイン名をコピー&ペーストして開きます。
image.png

「F12」でデベロッパーを開き、「F5」でページをリロードします。
image.png

すると、cloudfrontのx-Cache:が、Hitになっています。(p_-)
image.png

※そして注目すべきは、下図の赤枠、レスポンスタイムがキャッシュを利用することで10分の1以下になっています。
image.png

【参考】

これまでに設定したデフォルトの振る舞い(ビヘイビア)の設定を変更したら、現在期待している「ClooudFrontにキャッシュさせる。」といった目標は達成されるカモしれません。こちらは検証していませんが、理論上いけそうですね。

今の設定
image.png

変更するとしたら
image.png

ポリシーをカスタムせず、キャッシュするデフォルトのポリシーは
image.png
※恐らくこの設定でできますが、ハンズオンの動画に沿って、カスタムポリシーを新たに作成したものを使っていきます!

【参考終わり。】

次はAPIをLambdaで動かします。

まず、Lambdaを作成

image.png
Pythonで作ります。
image.png

以下デフォルトで行きます。
参考として画像を貼り付けます。様々便利な設定やセキュリティの設定が可能ですね。
image.png
image.png

Lambdaのセットアップができました。
image.png
画面をスクロールして、事前にハンズオンのサイトからダウンロードした関数をコピーしてきて、Lambda_function.pyに貼り付けます。
※ここでboto3というライブラリが(^^;なんだこれw
https://aws.amazon.com/jp/sdk-for-python/
超要約すると、リソースを操作できるライブラリですね。
image.png
以下このコード(公式さん作成)を貼っておきます。

import boto3

def lambda_handler(event, context):
    translate = boto3.client(service_name='translate', use_ssl=True)
    result = translate.translate_text(Text=event['queryStringParameters']['input_text'], SourceLanguageCode="ja", TargetLanguageCode="en").get('TranslatedText')
    return {
        'statusCode': 200,
        'body': result
    }

この関数が呼ばれたら通信成功かどうかと結果が返されますね。結果というのは、translateというサービスで翻訳されたテキストなのですね。
デプロイをクリック!
image.png

タブを移動し、設定、アクセス権限に移動します。
image.png

ロール名をクリック
image.png

IAMに連れてこられます。
image.png

許可を追加→ポリシーをアタッチ
image.png

translate(翻訳サービス)を検索して、リードオンリーを選択して許可を追加。
image.png
image.png

APIを作成

image.png

これ
image.png
分かりやすい説明
https://camp.trainocate.co.jp/magazine/rest-api/
CRUD操作とHTTPメソッドがごっちゃになって混乱したらこのサイト見ることにしますw
超要約すると、REST APIは、ステートレスにしたい時のAPI

以下の表は、CCNAの黒本から抜粋していますので確度は高いと思います!

CRUD 処理内容 HTTPメソッド
Create データの作成 POST
Read   データの取得 GET
Update データの更新 PUT
Delete データの削除 DELETE

続きやっていきます。
image.png

エンドポイントタイプは分かりやすい説明が付いていますので割愛します。
image.png

LambdaとAPIの関連付け設定。

メソッドの作成
image.png
image.png
プロキシ統合をONにして、作成した関数を指定。
image.png
※プロキシ統合は基本ONが良いかもですね。OFFであるとブラウザへの表示がコード表記のままになってしまうようです。

続いてクエリストリームの設定
クエリストリームとはGETメソッドには必要なもの。と解釈していきましょう。
例:https://〇〇.execute-api.us-east-1.amazonaws.com/api?input_text=こんにちは
この「?」以降の部分をクエリストリームという。

メソッドリクエストをクリック
image.png
スクロールして編集をクリック。
image.png
クエリ文字列パラメータ
image.png
メッソドリクエスト編集。ここでは俗にいう「APIキー」を設定し、APIの背後へのアクセスを局限することができるやつw公式の説明↓
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-method-settings-method-request.html
ふと思ったけど、、、開発系が得意な人向けなフィールドにお邪魔してませんかねw調べる頻度がえぐい|д゚)

image.png
URL文字列パラメータをセットアップして、リクエストを文字列に制御して取得する準備ができました。
image.png
image.png

APIのデプロイ。APIのデプロイをクリック。
image.png
こうしてこう。
image.png
ステージ。つまり、本番、開発をしっかり分けて管理するためのもの。
image.png
APIができたので、試します。
URLをブラウザに入れて実行
image.png
エラー。。。
クエリストリームを追加しなければならないとのこと。
image.png
うむ。翻訳してくれている。
image.png

動的コンテンツを配信

まず、S3バケット向きのキャッシュを使用した接続とは違い、動的なコンテンツ配信は基本的にキャッシュは無効にする必要がある。
もしキャッシュを設定した状態で動的にデータベースへの保存を行った場合、キャッシュを有効にしていたがために、確実にデータが保存されないなんてことが発生する。

そして、ユーザーからのアクションであるクエリストリームは、オリジンまで到達はしていない。APIの振る舞いによってホワイトリスト(オリジンリクエストポリシー)として届けられる。

image.png
ホワイトリスト(オリジンリクエストポリシー)を設定
image.png
image.png
ここはアンダーバーを使います。ハイフンは使えません。
image.png
クエリ文字列を指定
image.png
image.png
image.png

ディストリビューションに追加
image.png
今オリジンとして認識されているのはS3のみなので、オリジンを作成する。
image.png
ドメイン名を選択
image.png
HTTPSのみを選択し、あとはデフォルト
image.png
image.png
image.png
できました。
image.png

続いて振る舞いを新規作成
image.png
先程ステージ名を「api」と命名したので、APIを選択する。
これでオリジンであるAPI Gatewayに接続する大事な設定なので、今回はワイルドカードが付いていない「api」と入力します。
image.png
オリジンはAPIを選択
image.png
デフォルトでキャッシュしない設定になっています。
また、オリジンリクエストポリシーは、先程作成した動的コンテンツ用のポリシーを選択します。
image.png
あとはデフォルトです。
image.png
image.png

ここまできたら、CloudFrontがキャッシュをせずに、動的コンテンツが異常なくデプロイできているか確認します。

動的コンテンツが動くか確認
image.png
ここからドメイン名をコピーし、ブラウザにペーストして、実際にアプリに日本語を打ち込みます。
image.png
こんにゃくでは翻訳できているか微妙なので、文字を変えます(-_-;)
image.png
アプリの動作は異常なし。

次にちゃんとキャッシュ無しで設定できているかデベロッパーツールで確認
「F12」でデベロッパーツールを開き、Networkタブで、「F5」を押下してリロードします。
image.png
長い名前の動的コンテンツをクリックして、X-Cache:を確認すると、ちゃんとMissになっています。キャッシュが働いていない状態になってくれています。
image.png

ここからAWS WAFを設定していきます。

細部は以前まとめたので割愛します。
ここからAWS WAFの課金について少し触れます。
公式さんのサイトを見てすぐわかることは、初期費用はかからないけど、そのあとの費用は複雑です。ということ(泣)
次のスライドに示すAWSが提供しているルールセットは、キャパシティユニットは消費するものの、無料で利用することができるそうです。
正直有料と無料の線引きがわからないので、やってみて体感します(爆)
image.png

全般の解説について参考サイトを貼っておきます。
公式サイト:
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/getting-started.html

参考サイト:
https://www.cybermatrix.co/post/aws-waf-setup-with-managedrule

これを信じてAWS WAFの設定を開始します!
image.png

Web ACLを作成
Amazon CloudFront distributionsを選択
image.png
image.png
image.png

CloudFrontと紐づけるために、設定を続ける。
「Add AWS resources」をクリック。
image.png
image.png
image.png

NEXTクリック。ルールを作成していく。
image.png
my own rulesを選択
image.png
今回はRule Builderを選択
image.png
image.png
ここでAND,OR条件を付加できる。今回はデフォルト。
image.png
検査について設定。どこの国からのリクエストをどうする。といった設定が可能
country codesは、「japan」と入力すれば、候補が表示されます。
image.png
今こんな感じ
image.png
なお、Source IPはセキュリティ上で検査したい場合に応じて任意に設定するそうです。

Thenを設定。ここは、条件に応じたアクションを設定できます。
「今回は、日本からのアクセスを拒否」する設定を行っているので、拒否を選択。
他には拒否したときのCastom responseで設定できるみたいですね。
image.png

image.png
現在のルールの状態が表示されています。
設定してきたown ruleがありますね((((;゚Д゚))))ガクガクブルブル

また、ここは、AWS Marketplaceの販売業者が提供している想定攻撃に対するセキュリティを提供する場として設けられているようです。つまり、aws以外の事業者がひしめき合っており、我々としてはセキュリティ技術を買う場所という感じですね。
ちなみにAWSが提供している無料のマネージドルールは、上にスライドを貼り付けているので参考までに。

image.png
中段にあるリンクがある費用に関する日本語訳

ウェブACLの合計WCUsは、5000を超えることはできません。1500以上のWCUsを使用すると、コストに影響します。

Web ACLはそもそも、1つの単位として、いくつかのルールを適用することができるようですね。これの上限を超えることはできず、私のルール設定の場合は、5000WCUs(5000ウェブキャパシティユニット)という容量は超えられないみたいです。(追加料金が発生するようです。)

ここは、現在設定している条件「以外」の設定を行うことができます。
つまり、現在は日本からくるアクセスを拒否するので、それ以外の他国は、許可する設定となります。
image.png

基本WAFは指定されたトークン(セッションと理解)しか保護できないため、複数設定することができる。細部は、次の公式サイトリンクから確認しましょう。
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/waf-tokens-domains.html
image.png
今回はデフォルトで、NEXTをクリック。

今回は1つしかルールを作成していないので、プライオリティについての設定はなしっす。
image.png

リクエストのサンプリングを行うオプションがあるようです。((((;゚Д゚))))ガクガクブルブル
image.png
デフォルトで次に行きます。

サマリ(まとめ)です。しっかり確認しましょう。
image.png
image.png
image.png
image.png
image.png
Web ACLできました。
image.png
CloudFront側でも認識されているか確認する。
image.png
IDをクリック。WAFがあります。
image.png
ドメインにアクセスしてみる。
ドメイン名をコピーしてブラウザにペースト。
拒否されているので成功ですね!!
image.png

続けて、AWSのマネージドルールも設定してみる。((((;゚Д゚))))ガクガクブルブル
image.png
「WAF ACLs」をクリック。
image.png
ここで赤枠内、グローバルにしてあげると、たった今作成したWeb ACLの存在を確認できます。
image.png
Nameをクリック。
スクロールすると、先程日本(私のPC)からの接続を拒否した履歴が確認できますね(p_-)
image.png

画面上のタブでRulesへ移動し、ルールを追加していく。
image.png
今回はマネージドルールを選択。
image.png
各種サービスがありますね。ここでは最上段AWSのサービスを選択します。
image.png
image.png

スクロールして「Core rule set」を選択。
一般的な脆弱性が確認される部分を守るもの。
公式サイト:
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-baseline.html#aws-managed-rule-groups-baseline-crs
選択する。そして最下段までスクロールし、add rulesをクリック。
image.png
すると画面が遷移する。
image.png
優先順位を決められる。今回はデフォルトでsave

こんな感じで残容量が確認できるのですね。
image.png

リソースの削除

1 CloudFront
最初は削除できないため、「無効」をクリックした後、多少待って削除
image.png
2 続けてポリシーを削除
デフォルト以外を削除する。
image.png
image.png
image.png
image.png
3 AWS WAFを削除
image.png
image.png
4 API Gatewayを削除
image.png
image.png
5 Lambdaを削除
image.png
image.png
6 S3の削除
空にしてから、削除。
image.png
image.png
7 デベロッパーツールの設定をもとに戻します。
ここを
image.png
こうw
image.png
ちゃんと元に戻して、キャッシュが残るようにしましょう!

では!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0