内容
・趣旨目標
・公式サイト
・使用できるサービス
・目指す構成
・環境
・S3バケットから作成
・CloudFrontを作成
・S3バケットポリシーを編集(CloudFrontと接続)キャッシュ無し。
・カスタムポリシーを作成して、キャッシュさせる設定
・Lambdaを作成
・APIを作成
・LambdaとAPIの関連付け設定
・動的コンテンツを配信
・AWS WAFを設定
・リソースの削除
趣旨目標
手を動かして学習します。SAA試験対策になればなお良し|д゚)
公式サイト:
使用できるサービス:
Amazon CloudFront,AWS WAF
目指す構成
環境
バージニア北部、IAMユーザーで作業します。(ハンズオンの通り。)
S3バケットから作成
静的コンテンツをアップロード(公式作成データ「fors3」)
フォルダごとイン!そしてアップロード。
CloudFrontを作成
・バケットにアクセスする方法をOAI(現OAC)によって接続する設定を行う。
赤枠ドロップダウンから選択(入力必須です。)。
Create new OACをクリック。
※OACとは:
https://aws.amazon.com/jp/blogs/news/amazon-cloudfront-introduces-origin-access-control-oac/
要するに、OAIよりOACの方がセキュアです。ということ。
これまでは、S3自身で暗号化していた場合、OAIで接続することができなかったが、現状ではS3側で暗号化された状態でも接続することができる!私が調べた結果なので参考までに(^^;
「OAC」を選択しましょう。
この署名は「SigV4」というaws独自のプロトコルでアクセスキーとシークレットキーを使用して相手を認証するものですね。Front側からS3側にデータを送った時の認証用ですね!これは処理上、署名リクエストにチェックを入れましょう。処理速度に影響するとのことです。
なお、”上書きしない”サブオプションは基本使わなそうですね読んだ感じ。
Createをクリック。
↓公式さんサイトにここの説明がないっす(泣)ひとまずタイムアウトとか、ヘッダーを追加することで更にセキュアになるということかな
続いてビヘイビア(振る舞い)を設定
ここでHTTPSからの接続としたいので、HTTPはHTTPSにリダイレクトします。
※ここではわざと次のとおり、キャッシュしない設定にしています。
後ほどキャッシュしていないことを確認する学習をするために、デフォルトでは真っ当な設定になっていますが、わざと設定を行っています。
ログ取ったり、「フィールドレベルの暗号化」でもっとセキュアにできるのですねー。
現状のCloudFrontにおいてAWS WAFが設定できちゃうのですね!水際対策!
(ハンズオンに従いスルーします。)
ここでどの範囲のエッジロケーションを含めるか決めて、料金が決まりますね。
恐ろしい|д゚)
また、ドメインの指定や、証明書も発行(ACM)できちゃいますね。
次の「デフォルトルートオブジェクト - オプション」はデフォルトで見せたいページを表示させるオプション。気が利きますね!
今までで一番やかましい(笑)
黄色いポップアップに従い、「ポリシーをコピー」し、リンクから設定を行う。
S3バケットポリシーを編集(CloudFrontと接続)
これでCloudFrontからS3に接続できるはずですので、CloudFrontに移動します。
接続確認と、自身のブラウザのキャッシュ機能を停止させる作業を行います。
ディストリビューションをクリックし、「ドメイン名」をコピーして新しいタブをさらに開き、貼り付けます。
すると左側のように先程設定したindex.htmlが表示されるので、「F12」でデベロッパーツールを表示させ、「Network」の「Disable cache」にチェックを入れます。
※ハンズオンが終わったらデベロッパーツールの設定を元に戻します。
続いて、Networkの画面で「F5」を押下して画面更新する。すると「cloudfront」という項目があるので、選択してX-cache:欄を確認するとMissとなっており、CloudFrontは現在キャッシュできていないことがわかります。
このブラウザは開きっぱなしで
次に進みます。
CloudFrontにキャッシュを持たせる設定に修正していき検証
CloudFrontに移動し、ポリシーから先程自分で設定した「Caching Disabled」を選択。
現状次のようにTTL(時間がきたら捨てる設定)の値がブランクになっており、キャッシュされない設定になっているのが確認できる。
カスタムポリシーを作成して、キャッシュさせる設定
最低1秒で削除、デフォルトは86400秒(1日)キャッシュしてくれて、最大31536000秒(1年)キャッシュする設定。
表記のとおりのキャッシュので設定であると、URLとパスを組み合わせてキャッシュし、逆に「ALL」を選択した場合は、キャッシュ率という指標が低下してしまい、その分オリジンに負荷がかかってしまう設定となる。
振る舞い(ビヘイビア)を作成
パスパターンとは:
・公式ドキュメント
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を指すもの。」と勝手に解釈しています|д゚)
デフォルトのキャッシュ設定ではなく、今作成したポリシーを当てます。
次の画像で今作成した振る舞いが追加されていることに併せて、上から順にポリシーが適用される設定になっています。
検証していきます。
こちらに戻ります。ブラウザにディストリビューションのドメイン名をコピー&ペーストして開きます。
「F12」でデベロッパーを開き、「F5」でページをリロードします。
すると、cloudfrontのx-Cache:が、Hitになっています。(p_-)
※そして注目すべきは、下図の赤枠、レスポンスタイムがキャッシュを利用することで10分の1以下になっています。
【参考】
これまでに設定したデフォルトの振る舞い(ビヘイビア)の設定を変更したら、現在期待している「ClooudFrontにキャッシュさせる。」といった目標は達成されるカモしれません。こちらは検証していませんが、理論上いけそうですね。
ポリシーをカスタムせず、キャッシュするデフォルトのポリシーは
※恐らくこの設定でできますが、ハンズオンの動画に沿って、カスタムポリシーを新たに作成したものを使っていきます!
【参考終わり。】
次はAPIをLambdaで動かします。
まず、Lambdaを作成
以下デフォルトで行きます。
参考として画像を貼り付けます。様々便利な設定やセキュリティの設定が可能ですね。
Lambdaのセットアップができました。
画面をスクロールして、事前にハンズオンのサイトからダウンロードした関数をコピーしてきて、Lambda_function.pyに貼り付けます。
※ここでboto3というライブラリが(^^;なんだこれw
https://aws.amazon.com/jp/sdk-for-python/
超要約すると、リソースを操作できるライブラリですね。
以下このコード(公式さん作成)を貼っておきます。
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というサービスで翻訳されたテキストなのですね。
デプロイをクリック!
translate(翻訳サービス)を検索して、リードオンリーを選択して許可を追加。
APIを作成
これ
分かりやすい説明
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 |
エンドポイントタイプは分かりやすい説明が付いていますので割愛します。
LambdaとAPIの関連付け設定。
メソッドの作成
プロキシ統合をONにして、作成した関数を指定。
※プロキシ統合は基本ONが良いかもですね。OFFであるとブラウザへの表示がコード表記のままになってしまうようです。
続いてクエリストリームの設定
クエリストリームとはGETメソッドには必要なもの。と解釈していきましょう。
例:https://〇〇.execute-api.us-east-1.amazonaws.com/api?input_text=こんにちは
この「?」以降の部分をクエリストリームという。
メソッドリクエストをクリック
スクロールして編集をクリック。
クエリ文字列パラメータ
メッソドリクエスト編集。ここでは俗にいう「APIキー」を設定し、APIの背後へのアクセスを局限することができるやつw公式の説明↓
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-method-settings-method-request.html
ふと思ったけど、、、開発系が得意な人向けなフィールドにお邪魔してませんかねw調べる頻度がえぐい|д゚)
URL文字列パラメータをセットアップして、リクエストを文字列に制御して取得する準備ができました。
APIのデプロイ。APIのデプロイをクリック。
こうしてこう。
ステージ。つまり、本番、開発をしっかり分けて管理するためのもの。
APIができたので、試します。
URLをブラウザに入れて実行
エラー。。。
クエリストリームを追加しなければならないとのこと。
うむ。翻訳してくれている。
動的コンテンツを配信
まず、S3バケット向きのキャッシュを使用した接続とは違い、動的なコンテンツ配信は基本的にキャッシュは無効にする必要がある。
もしキャッシュを設定した状態で動的にデータベースへの保存を行った場合、キャッシュを有効にしていたがために、確実にデータが保存されないなんてことが発生する。
そして、ユーザーからのアクションであるクエリストリームは、オリジンまで到達はしていない。APIの振る舞いによってホワイトリスト(オリジンリクエストポリシー)として届けられる。
ホワイトリスト(オリジンリクエストポリシー)を設定
ここはアンダーバーを使います。ハイフンは使えません。
クエリ文字列を指定
ディストリビューションに追加
今オリジンとして認識されているのはS3のみなので、オリジンを作成する。
ドメイン名を選択
HTTPSのみを選択し、あとはデフォルト
できました。
続いて振る舞いを新規作成
先程ステージ名を「api」と命名したので、APIを選択する。
これでオリジンであるAPI Gatewayに接続する大事な設定なので、今回はワイルドカードが付いていない「api」と入力します。
オリジンはAPIを選択
デフォルトでキャッシュしない設定になっています。
また、オリジンリクエストポリシーは、先程作成した動的コンテンツ用のポリシーを選択します。
あとはデフォルトです。
ここまできたら、CloudFrontがキャッシュをせずに、動的コンテンツが異常なくデプロイできているか確認します。
動的コンテンツが動くか確認
ここからドメイン名をコピーし、ブラウザにペーストして、実際にアプリに日本語を打ち込みます。
こんにゃくでは翻訳できているか微妙なので、文字を変えます(-_-;)
アプリの動作は異常なし。
次にちゃんとキャッシュ無しで設定できているかデベロッパーツールで確認
「F12」でデベロッパーツールを開き、Networkタブで、「F5」を押下してリロードします。
長い名前の動的コンテンツをクリックして、X-Cache:を確認すると、ちゃんとMissになっています。キャッシュが働いていない状態になってくれています。
ここからAWS WAFを設定していきます。
細部は以前まとめたので割愛します。
ここからAWS WAFの課金について少し触れます。
公式さんのサイトを見てすぐわかることは、初期費用はかからないけど、そのあとの費用は複雑です。ということ(泣)
次のスライドに示すAWSが提供しているルールセットは、キャパシティユニットは消費するものの、無料で利用することができるそうです。
正直有料と無料の線引きがわからないので、やってみて体感します(爆)
全般の解説について参考サイトを貼っておきます。
公式サイト:
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/getting-started.html
参考サイト:
https://www.cybermatrix.co/post/aws-waf-setup-with-managedrule
Web ACLを作成
Amazon CloudFront distributionsを選択
CloudFrontと紐づけるために、設定を続ける。
「Add AWS resources」をクリック。
NEXTクリック。ルールを作成していく。
my own rulesを選択
今回はRule Builderを選択
ここでAND,OR条件を付加できる。今回はデフォルト。
検査について設定。どこの国からのリクエストをどうする。といった設定が可能
country codesは、「japan」と入力すれば、候補が表示されます。
今こんな感じ
なお、Source IPはセキュリティ上で検査したい場合に応じて任意に設定するそうです。
Thenを設定。ここは、条件に応じたアクションを設定できます。
「今回は、日本からのアクセスを拒否」する設定を行っているので、拒否を選択。
他には拒否したときのCastom responseで設定できるみたいですね。
現在のルールの状態が表示されています。
設定してきたown ruleがありますね((((;゚Д゚))))ガクガクブルブル
また、ここは、AWS Marketplaceの販売業者が提供している想定攻撃に対するセキュリティを提供する場として設けられているようです。つまり、aws以外の事業者がひしめき合っており、我々としてはセキュリティ技術を買う場所という感じですね。
ちなみにAWSが提供している無料のマネージドルールは、上にスライドを貼り付けているので参考までに。
ウェブACLの合計WCUsは、5000を超えることはできません。1500以上のWCUsを使用すると、コストに影響します。
Web ACLはそもそも、1つの単位として、いくつかのルールを適用することができるようですね。これの上限を超えることはできず、私のルール設定の場合は、5000WCUs(5000ウェブキャパシティユニット)という容量は超えられないみたいです。(追加料金が発生するようです。)
ここは、現在設定している条件「以外」の設定を行うことができます。
つまり、現在は日本からくるアクセスを拒否するので、それ以外の他国は、許可する設定となります。
基本WAFは指定されたトークン(セッションと理解)しか保護できないため、複数設定することができる。細部は、次の公式サイトリンクから確認しましょう。
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/waf-tokens-domains.html
今回はデフォルトで、NEXTをクリック。
今回は1つしかルールを作成していないので、プライオリティについての設定はなしっす。
リクエストのサンプリングを行うオプションがあるようです。((((;゚Д゚))))ガクガクブルブル
デフォルトで次に行きます。
サマリ(まとめ)です。しっかり確認しましょう。
Web ACLできました。
CloudFront側でも認識されているか確認する。
IDをクリック。WAFがあります。
ドメインにアクセスしてみる。
ドメイン名をコピーしてブラウザにペースト。
拒否されているので成功ですね!!
続けて、AWSのマネージドルールも設定してみる。((((;゚Д゚))))ガクガクブルブル
「WAF ACLs」をクリック。
ここで赤枠内、グローバルにしてあげると、たった今作成したWeb ACLの存在を確認できます。
Nameをクリック。
スクロールすると、先程日本(私のPC)からの接続を拒否した履歴が確認できますね(p_-)
画面上のタブでRulesへ移動し、ルールを追加していく。
今回はマネージドルールを選択。
各種サービスがありますね。ここでは最上段AWSのサービスを選択します。
スクロールして「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をクリック。
すると画面が遷移する。
優先順位を決められる。今回はデフォルトでsave
リソースの削除
1 CloudFront
最初は削除できないため、「無効」をクリックした後、多少待って削除
2 続けてポリシーを削除
デフォルト以外を削除する。
3 AWS WAFを削除
4 API Gatewayを削除
5 Lambdaを削除
6 S3の削除
空にしてから、削除。
7 デベロッパーツールの設定をもとに戻します。
ここを
こうw
ちゃんと元に戻して、キャッシュが残るようにしましょう!
では!