🚴🏻‍♀️

【Amazon CloudFront】AWSの基礎を学ぼう のおさらい

2021/06/26に公開

概要

「AWS エバンジェリストシリーズ AWSの基礎を学ぼう」で”Amazon CloudFrontのおさらい”というイベントに参加した感想ページです。

「AWS エバンジェリストシリーズ AWSの基礎を学ぼう」とは

AWS エバンジェリストシリーズ AWSの基礎を学ぼう

以下、Connpassページより引用

Amazon Web Services (AWS)は現在200を超えるサービスを提供し、日々サービスの拡充を続けています。
このAWS エバンンジェリストシリーズでは週次でAWSのサービスをひとつづつ取り上げながらその基礎を説明していく 初心者、中級者をターゲットとした講座です。午後の仕事前にスキルアップを一緒にしませんか?
注意点 登壇者による発表内容はアマゾン ウェブ サービス ジャパンとして主催しているものではなく、コミュニティ活動の一環として勉強会の主催を行っているものです。

毎週ありがとうございます!

整理

Edge Services

AWSのエッジロケーションから提供されるサービス群を意味する
代表的なサービスとしては以下

  • Amazon Route53
  • AWS Global Accelerator
  • AWS WAF
  • AWS Shield
  • AWS Lambda@Edge
  • Amazon CloudFront

エッジロケーション

リージョン別エッジキャッシュ

パフォーマンス向上を目的に、リージョン毎にキャッシュを持つ、これによりオリジンの負荷をさらに下げることが可能

CloudFrontってなぜ必要?

以下を解決させるためにCloudFrontが必要

  • ネットワーク遅延は距離に依存する、グローバルなサービスである場合にアメリカと日本で通信をさせるのは非常に多くの時間を要することになる
    ⇨ ユーザーに近いエッジロケーションにアクセスするため、レスポンス向上。
  • 大量アクセスの場合にオリジンが高負荷にさらされる、静的コンテンツについても全てをオリジンからアクセスするのは無駄が多い。
    ⇨ キャッシュしたコンテンツを配信するため、負荷軽減。

どうやって近いエッジを探しているのか?

  1. クライアントがドメイン名をDNSに問い合わせ 「www.example.comってIP何?」
  2. DNSがCloudFront DNSにIPアドレス問い合わせ 「www.cloudfront.netってIP何?」
  3. CloudFront DNSがクライアントのIPから地域を判断して、最適なエッジIPを応答 「13.32.1.1です」
  4. DNSがクライアントに応答 「13.32.1.1ですって」
  5. クライアントがエッジにアクセス 「コンテンツ頂戴ー」
  6. エッジにキャッシュがあれば、応答 「コンテンツはこちら」
  7. エッジにキャッシュが無ければ、オリジンにアクセスしてから、応答 「お待たせ、コンテンツはこちら」

コンソール画面について


さて、コンソール画面を見ると色々あるけど分からん。
今回気になったのは「Key management」

Key management

選ばれたユーザーにのみコンテンツ配信をすることができます、その手法として以下があります

  • 署名付き URL
  • 署名付き Cookie

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-choosing-signed-urls-cookies.html

署名付き URL

以下の場合においては署名付きURLを使用します。

  • 個別のファイル (アプリケーションのインストールダウンロード) へのアクセスを制限する場合。
  • ユーザーが Cookie をサポートしていないクライアント (カスタム HTTP クライアントなど) を使用している場合。

以下の場合においては署名付きCookieを使用します。

  • 複数の制限されたファイル (HLS 形式の動画のすべてのファイルやウェブサイトの購読者の領域にあるすべてのファイルなど) へのアクセスを提供する場合。
  • 現在の URL を変更したくない場合。

署名付き URL は署名付き Cookie よりも優先されます。

署名付き URL の使用

RSA秘密鍵の生成

% openssl genrsa -out private.key 2048
Generating RSA private key, 2048 bit long modulus
..........................+++
..............+++
e is 65537 (0x10001)

RSA公開鍵の生成

% openssl rsa -in private.key -pubout -out public.key
writing RSA key

ファイル確認

% ls -l
total 16
-rw-r--r--  1 shigeruoda  staff  1675  6 26 17:03 private.key
-rw-r--r--  1 shigeruoda  staff   451  6 26 18:33 public.key

公開鍵をKey management - Public keysに登録

登録した鍵をキーグループに登録する

Behaviors(振る舞い)を設定する

通常アクセス

% curl http://dzpc85o8c8u92.cloudfront.net/
<?xml version="1.0" encoding="UTF-8"?><Error><Code>MissingKey</Code><Message>Missing Key-Pair-Id query parameter or cookie value</Message></Error>% 

良い感じに弾かれています。

署名付きURLアクセス

まずはURL作成
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/sign.html

% aws cloudfront sign \
    --url http://dzpc85o8c8u92.cloudfront.net/ \
    --key-pair-id K1J8KDJ1UBRRXO \
    --private-key file://private.key \
    --date-less-than 2021-06-26T20:00:00+09:00
http://dzpc85o8c8u92.cloudfront.net/?Expires=1624705200&Signature=kJxsxACOd2nXHMBLXB17ecNfZWvR9ZNma5ta-DobV6vm~zdfmDhsZVAvZ7ZeqMo3fp-zu~RRdl79TmvFcvIs2J0E-KGdKlitGPiJ2TTV2i7Nao1PgVduEWxXY6KbEXnqBw~UAjjaMhJFCjG926dkpnEy45Urm~urlMHNlM79jw5uw1qNsW2idwjVITAyiV-A5px9Mtfz-oIEILfMCKGSQoFLUV7t9aClcseybgQ0vv3FUQhIwEwHjyeFwg1Yff4Skl1J5jgUShdALfsvSKkHpT3xNAn69XgHgtLtB9GNzlHfnRdpHrqb7iyYlkCAygvqR40NS32avQjaVXXfPidM0A__&Key-Pair-Id=K1J8KDJ1UBRRXO%                                            

作成されたURLでアクセス可能なことを確認

% curl "http://dzpc85o8c8u92.cloudfront.net/?Expires=1624705200&Signature=kJxsxACOd2nXHMBLXB17ecNfZWvR9ZNma5ta-DobV6vm~zdfmDhsZVAvZ7ZeqMo3fp-zu~RRdl79TmvFcvIs2J0E-KGdKlitGPiJ2TTV2i7Nao1PgVduEWxXY6KbEXnqBw~UAjjaMhJFCjG926dkpnEy45Urm~urlMHNlM79jw5uw1qNsW2idwjVITAyiV-A5px9Mtfz-oIEILfMCKGSQoFLUV7t9aClcseybgQ0vv3FUQhIwEwHjyeFwg1Yff4Skl1J5jgUShdALfsvSKkHpT3xNAn69XgHgtLtB9GNzlHfnRdpHrqb7iyYlkCAygvqR40NS32avQjaVXXfPidM0A__&Key-Pair-Id=K1J8KDJ1UBRRXO" | head -5
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9184    0  9184    0     0   179k      0 --:--:-- --:--:-- --:--:--  179k
<!doctype html>
<html lang="en-US" >
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />

20時を超えるとエラーになる

% curl "http://dzpc85o8c8u92.cloudfront.net/?Expires=1624705200&Signature=kJxsxACOd2nXHMBLXB17ecNfZWvR9ZNma5ta-DobV6vm~zdfmDhsZVAvZ7ZeqMo3fp-zu~RRdl79TmvFcvIs2J0E-KGdKlitGPiJ2TTV2i7Nao1PgVduEWxXY6KbEXnqBw~UAjjaMhJFCjG926dkpnEy45Urm~urlMHNlM79jw5uw1qNsW2idwjVITAyiV-A5px9Mtfz-oIEILfMCKGSQoFLUV7t9aClcseybgQ0vv3FUQhIwEwHjyeFwg1Yff4Skl1J5jgUShdALfsvSKkHpT3xNAn69XgHgtLtB9GNzlHfnRdpHrqb7iyYlkCAygvqR40NS32avQjaVXXfPidM0A__&Key-Pair-Id=K1J8KDJ1UBRRXO"         
<?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><Message>Access denied</Message></Error>%          

以下は署名付きURLと同じ

  • RSA秘密鍵の生成
  • RSA公開鍵の生成
  • 公開鍵をKey management - Public keysに登録
  • 登録した鍵をキーグループに登録する
  • Behaviors(振る舞い)を設定する

通常アクセス

% curl http://dzpc85o8c8u92.cloudfront.net/
<?xml version="1.0" encoding="UTF-8"?><Error><Code>MissingKey</Code><Message>Missing Key-Pair-Id query parameter or cookie value</Message></Error>% 

良い感じに弾かれています。

ポリシーを作成

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html

{
    "Statement":
    [
        {
            "Resource":"http://dzpc85o8c8u92.cloudfront.net/*",
            "Condition":
            {
                "DateLessThan":
                {
                    "AWS:EpochTime":1627298059
                }
            }
        }
    ]
}

スペースや改行が邪魔になるので削り、ファイルに出力します。

{"Statement":[{"Resource":"http://dzpc85o8c8u92.cloudfront.net/*","Condition":{"DateLessThan":{"AWS:EpochTime":1627298059}}}]}

CloudFront-Policyの作成

% cat policy.json | openssl base64 | tr '+=/' '-_~'
eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2R6cGM4NW84Yzh1OTIu
Y2xvdWRmcm9udC5uZXQvKiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsi
QVdTOkVwb2NoVGltZSI6MTYyNzI5ODA1OX19fV19Cg__

CloudFront-Signatureの作成

% cat policy.json | openssl sha1 -sign private.key | openssl base64 | tr '+=/' '-_~'
LnfOtAk1YqPqjQqTzEbKgCj-8k6jiEJGjtpGbTS1NdN8NDXn868xRyXr3Fxb0NlC
RP~tnxUOOrsFnP6o7qSWKT0fFz5YikD4lkeB3~0YnyAk4mLlMAHOrRdis8mB7ZC4
2plTF10P~dJUcgmEabkFKyAfRR9r9w4AKBbGbp~3O40rwtETATJXSWcchT8pPcfu
9xj1KRByfgoKJmK~pzzFpGfmwb9kvrHQ7ROuXlEcm4mvbUj1dxeREZxsEvYB6eBz
V4eGDxO4DIqrN1xP3pudEJbwDvMH-b2EPKBs3~smtprQ4Bds64bhi~71EpYf0vL9
T50zFK1J-L7psORoEVSFcg__

アクセス

では生成した情報を元にアクセス

% curl -H 'Cookie:CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2R6cGM4NW84Yzh1OTIuY2xvdWRmcm9udC5uZXQvKiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTYyNzI5ODA1OX19fV19Cg__;CloudFront-Signature=LnfOtAk1YqPqjQqTzEbKgCj-8k6jiEJGjtpGbTS1NdN8NDXn868xRyXr3Fxb0NlCRP~tnxUOOrsFnP6o7qSWKT0fFz5YikD4lkeB3~0YnyAk4mLlMAHOrRdis8mB7ZC42plTF10P~dJUcgmEabkFKyAfRR9r9w4AKBbGbp~3O40rwtETATJXSWcchT8pPcfu9xj1KRByfgoKJmK~pzzFpGfmwb9kvrHQ7ROuXlEcm4mvbUj1dxeREZxsEvYB6eBzV4eGDxO4DIqrN1xP3pudEJbwDvMH-b2EPKBs3~smtprQ4Bds64bhi~71EpYf0vL9T50zFK1J-L7psORoEVSFcg__;CloudFront-Key-Pair-Id=K1J8KDJ1UBRRXO' http://dzpc85o8c8u92.cloudfront.net | head -5
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9184    0  9184    0     0  59251      0 --:--:-- --:--:-- --:--:-- 59251
<!doctype html>
<html lang="en-US" >
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />

感想

資格試験でCloudFrontは出るので概要は知っているのですが、単純なキャッシュ利用以外は触ったことがなかったので勉強になりました。

Discussion