#author("2024-11-01T17:38:29+09:00","default:dex","dex") #author("2024-11-27T11:59:17+09:00","default:dex","dex") #contents *CloudFront CDN [#e357e0e8] -[[Amazon CloudFront(コンテンツ・ストリーミング配信サービス) | アマゾン ウェブ サービス (AWS 日本語):http://aws.amazon.com/jp/cloudfront/]] --CloudFront専用ドメインにCNAMEを付けて使う。例:xxxxxxxxxxxxx.cloudfront.net CNAME www.example.com --コンテンツキャッシュのTTLは0秒以上で設定できるようになった --Restrict Bucket Access:YesにするとS3への直接アクセスは禁止、CloudFrontからのみアクセスできるようになる --/hoge/ ではコンテンツは表示されず、/hoge/index.html と記載する必要がある --SSLでのアクセスの場合、Hostヘッダーを許可すると「502 Bad Gateway」になるため。許可しない。 ---[[Cloudfront-Origin間のHTTPS通信エラー原因と対策(502:Bad Gateway) - Qiita:http://qiita.com/kaojiri/items/4e2d2f112acfca14970e]] -無効リクエスト(Invalidating) --[[Invalidating Objects (Download Distributions Only):http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html]] APIドキュメント --毎月1,000ファイルまで無償で無効化できる。それ以上は有償 --[[Q: Amazon CloudFront の価格はいくらですか?:http://aws.amazon.com/jp/cloudfront/faqs/#What_is_the_price_of_Amazon_CloudFront]] --[[Q: 無効リクエスト数には制限がありますか?:http://aws.amazon.com/jp/cloudfront/faqs/#Is_there_a_limit_to_the_number_of_invalidation_requests]] --[[(PDF)エッジロケーションからファイルを削除する方法に関する一般的な注意:http://adsj-contents.s3.amazonaws.com/product/CloudFront%E3%81%AEinvaliadtion%E6%96%B9%E6%B3%95_20120704.pdf]] --[[How to invalidate items in AWS CloudFront:https://gist.github.com/claylo/1009169]] PHP製ツール --[[AWS SDK fot .NET で CloudFrontのInvalidationを使う - hayashihがOSをインストールする日記:http://d.hatena.ne.jp/hayashih/20111204/p1]] -記事 -- [[[アップデート] CloudFront で動的に Brotli 形式の圧縮をできるようになりました! | Developers.IO:https://dev.classmethod.jp/articles/update-cloudfront-support-brotli/]] -- [[Amazon CloudFront を活用したウェブサイトの可用性向上 | Amazon Web Services ブログ:https://aws.amazon.com/jp/blogs/news/improve-your-website-availability-with-amazon-cloudfront/]] -- [[[小ネタ] CloudFrontでクエリ文字列を転送しているときのInvalidationにはクエリ文字列を忘れないように注意しよう | Developers.IO:https://dev.classmethod.jp/articles/amazon-cloudfront-invalidation-querystring/]] -- [[オリジンを S3 とした CloudFront に対して、存在しないオブジェクトへアクセスした際の HTTP ステータスコードが 403 Forbidden になったときの対処方法 | Developers.IO:https://dev.classmethod.jp/articles/tsnote-cloudfront-s3-notexistobject-403-001/]] -- [[Amazon CloudFrontはボディを含むGETリクエストに403(Forbidden)を返します | Developers.IO:https://dev.classmethod.jp/articles/cloudfront-return-403-for-get-method-with-message-body/]] -- [[CloudFrontの作成や更新時間が約5倍高速になりました | Developers.IO:https://dev.classmethod.jp/articles/slashing-cloudfront-change/]] -- [[[アップデート] Amazon CloudFrontでリソースレベルとタグベースでのアクセス許可が設定できるようになりました! | DevelopersIO:https://dev.classmethod.jp/cloud/aws/amazon-cloudfront-resource-level-tag-based-permission/]] -- [[AWS再入門ブログリレー Amazon CloudFront 編 | DevelopersIO:https://dev.classmethod.jp/cloud/aws/blogrelay2019_cloudfront/]] -- [[Amazon CloudFront の代替ドメイン名(CNAMEs)設定に SSL 証明書が必須になりました | DevelopersIO:https://dev.classmethod.jp/cloud/aws/201904_enhancing-domain-security-on-cloudfront/]] --[[WP管理者必見!AWSで構築する新スケーラブルなWordPress構成~CloudFront as Reverse Proxy | Developers.IO:http://dev.classmethod.jp/cloud/aws/wordpress_with_cloudfront_front-ended/]] --[[[新機能] Amazon CloudFrontでHostヘッダを転送する | Developers.IO:http://dev.classmethod.jp/cloud/cloudfront-host-header-forward/]] --[[[新機能] Amazon CloudFrontがジオターゲティングに対応しました | Developers.IO:http://dev.classmethod.jp/cloud/aws/cloudfront-geo-targeting/]] --[[CloudFrontのオリジンサーバによる機能の違い | Developers.IO:http://dev.classmethod.jp/cloud/aws/difference-between-cf-origin/]] --[[Amazon CloudFrontの強化されたアクセス分析機能を整理してみた | Developers.IO:http://dev.classmethod.jp/cloud/cloudfront-enhanced-analyze-features/]] --[[Amazon S3 + CloudFrontによるYumリポジトリにリダイレクトルールを適用する | Developers.IO:http://dev.classmethod.jp/cloud/yum-repo-s3cf-redirect/]] --[[Amazon CloudFrontのキャッシュ期間をコントロールする(2015年6月版) | Developers.IO:http://dev.classmethod.jp/cloud/cloudfront-cache-control/]] --[[[CloudFront + S3]特定バケットに特定ディストリビューションのみからアクセスできるよう設定する | Developers.IO:http://dev.classmethod.jp/cloud/aws/cloudfront-s3-origin-access-identity/]] --[[memorycraft: S3ってなんじゃ?(CloudFrontでアクセス制御:Origin Access Identity × 署名付きURL):http://memocra.blogspot.jp/2013/02/s3cloudfrontorigin-access-identity-url.html]] --[[memorycraft: S3ってなんじゃ?(CloudFrontでストリーミングログを取得):http://memocra.blogspot.jp/2012/02/s3cloudfront.html]] ---- ** CSP(Content-Security-Policy)を設定する [#z73c5fc5] - [[Content-Security-Policy - レスポンスヘッダーポリシーを理解する - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/understanding-response-headers-policies.html#understanding-response-headers-policies-security]] - terraformで設定する場合は[[aws_cloudfront_response_headers_policy:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_response_headers_policy]]を使うようだ 記事: - [[CSPのざっくり概要:https://zenn.dev/yuu104/articles/content-secutity-policy]] 検証ツール: - [[CSP Evaluator:https://csp-evaluator.withgoogle.com/]] --- ** コスト分析 [#c675024c] 記事: - [[コスト観点で見る CloudFront - Speaker Deck:https://speakerdeck.com/4hei4hei/kosutoguan-dian-dejian-ru-cloudfront]] ---- ** CloudFront を経由しないアクセスのブロック [#y9c6e57c] 記事 - [[TerraformでCloudFrontのManaged Prefix Listを取得してみた | DevelopersIO:https://dev.classmethod.jp/articles/terraform-cloudfromt-managed-prefix-list/]] - [[【アップデート】Amazon CloudFront を経由しないアクセスのブロックが簡単になりました | DevelopersIO:https://dev.classmethod.jp/articles/amazon-cloudfront-managed-prefix-list/]] ---- ** カスタムエラーレスポンス [#fbfed92a] - [[カスタムエラーレスポンスの生成 - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html#custom-error-pages-response-code]] ---- ** 署名(有効期限)付きURL、署名付きCookie [#e360ca1a] - [[署名付き URL と署名付き Cookie を使用したプライベートコンテンツの提供 - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html]] - 記事 -- [[【SAP対策】CloudFrontで署名付きURLを発行する【やってみた】 | Developers.IO:https://dev.classmethod.jp/articles/sap-exam-study-2/]] ---- ** 不明なAWSアカウントIDのCloudFront [#zc91c051] 問題: - us-east-1のACMに、見覚えのないCloudFrontとAWS account id(969236854626)がある #geshi(text){{ arn:aws:cloudfront::969236854626:distribution/0123456789ABCD }} - us-east-1のCloudFrontを見ても、該当のdistribution IDは無い。 - どこから使われてるのか分からない。ACMは参照元がある限り消せない。 対処: - API Gatewayでカスタムドメインを使い、httpsを設定すると、自動でCloudFrontが作られる。リージョン毎に固定のAWSアカウントIDが使われる。 -- [[エッジ最適化のカスタムドメイン名を作成する方法 - Amazon API Gateway:https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-edge-optimized-custom-domain-name.html]] > リージョン固有の API Gateway アカウント ID の 1 つにより識別されます > ap-northeast-1 969236854626 -- 使用していないカスタムドメインなら消す。そうすると、ACM側も消せるようになる。 - 記事 -- [[[AWS] 知らないアカウントIDのCloudFrontが自分のACM証明書を使っていると思ったけど違った:http://blog.tearthesky.com/2018/09/aws-idcloudfrontacm.html]] ---- ** アクセスログと検索 [#f0dad996] - [[標準ログ (アクセスログ) の設定および使用 - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html]] -- S3上に保存できる -- 2023-06: ACLを無効化したs3 bucketには保存できない - [[Amazon CloudFront ログのクエリ - Amazon Athena:https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudfront-logs.html]] -- Athenaから検索できる - 記事 -- [[Amazon CloudFrontに2019年12月から追加されていたアクセスログの7つの新フィールドについて確認してみた | Developers.IO:https://dev.classmethod.jp/articles/amazon-cloudfront-access-logs-new-field-201912/]] -- [[CloudFrontログを別のAWSアカウントのS3バケットに出力する | DevelopersIO:https://dev.classmethod.jp/cloud/aws/cloudfront-logs-to-cross-account-bucket/]] ---- ** Basic認証 [#q51e2702] 記事: - [[CloudFront FunctionsでBasic認証のパスワードをかける | DevelopersIO:https://dev.classmethod.jp/articles/apply-basic-authentication-password-with-cloudfront-functions/]] - [[Basic認証のあるサイトをCloudFrontでキャッシュする | Developers.IO:https://dev.classmethod.jp/cloud/aws/how-do-i-enable-basic-authentication-behind-cloudfront/]] -[[周回遅れエンジニアノート: CloudFront で Basic 認証使う:http://lapped-lapped.blogspot.jp/2014/07/cloudfront-basic.html]] ---- ** トラブルシューティング [#c0e6a714] - 記事 -- [[[こんな時どうする]CloudFrontのログが出力されない時の確認と対応事例 | DevelopersIO:https://dev.classmethod.jp/cloud/aws/cloudfront-log-settings-check/]] ---- ** 証明書のpublic keyサイズは2048bitまで [#y52149d2] 4096bitの証明書はACMへインポートはできるが、CloudFrontでは使えない。 - [[CloudFront で SSL/TLS の証明書を使用するための要件 - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-requirements.html#https-requirements-size-of-public-key]] > パブリックキーのサイズ > 証明書のパブリックキーの長さは、その保存場所によって異なります。 > AWS Certificate Manager (ACM) への証明書のインポート: パブリックキーの長さは 1,024 ビットまたは 2,048 ビットであることが必要です。ACM ではより大規模なキーがサポートされていますが、CloudFront で使用する証明書の制限は 2048 ビットです。 > AWS Identity and Access Management (IAM) 証明書ストアへの証明書のアップロード: パブリックキーの最大サイズは 2,048 ビットです。 > 2,048 ビットを使用することをお勧めします。 -記事 --[[CloudFront用に証明書をインポートするときは鍵長に注意しよう 〜ZeroSSLでデフォルトで作成される鍵を例にして〜 | DevelopersIO:https://dev.classmethod.jp/cloud/aws/cloudfront-pay-attention-to-key-length/]] ---- ** https対応 [#eb6e562c] httpsコンテンツ中にhttpが混ざると警告を発する。 - [[CloudFront で HTTPS を使用する - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/using-https.html]] - https://xxxxx.cloudfront.net/ -- cloudfront自体のSSL証明書を使う - https://www.example.com/ -- 独自ドメイン + 独自SSL証明書を使う - 記事 -- [[Amazon CloudFrontで専用IPによる独自SSLを試してみた | Developers.IO:https://dev.classmethod.jp/articles/amazon-cloudfront-dedicated-ip-custom-ssl/]] SNI非対応のクライアントの場合 ---- ** キャッシュの削除 [#z226e224] -[[オブジェクトの無効化 (ウェブディストリビューションのみ) - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html]] --有効期限前にキャッシュを無効化できる -記事 --[[【朗報】Amazon CloudFrontのキャッシュ削除(Invalidation)が速くなりました【5秒で90%】 | Developers.IO:https://dev.classmethod.jp/cloud/aws/cloudfront-fast-invalidation/]] -awscliの場合: #geshi(bash){{ # curlでキャッシュの状態を確認 curl -I https://example1234.cloudfront.net/path/to/image.jpg ... X-Cache: Hit from cloudfront # distribution-id一覧 AWS_PROFILE=default aws cloudfront list-distributions --profile $AWS_PROFILE --query 'DistributionList.Items[].[Id,DomainName,Origins.Items[].DomainName]' # distribution-idとpathを指定してキャッシュを削除 aws cloudfront create-invalidation \ --distribution-id ABCD1234 \ --paths /path/to/image.jpg \ --profile $AWS_PROFILE # invalidationsの一覧と進行状況表示。Status: Completedなら完了 aws cloudfront list-invalidations \ --distribution-id invalidation \ --profile $AWS_PROFILE # curlでキャッシュの有効期限が切れた事を確認 curl -I https://example1234.cloudfront.net/path/to/image.jpg ... X-Cache: Miss from cloudfront }} ---- ** S3 + CloudFront時にindex.htmlの省略 [#u6bd02a0] - S3 Origin + CloudFrontの場合、「DefaultRootObject = index.html」と設定をすると http://example.cloudfront.net/ へのリクエストでindex.htmlは読み込んでくれる。しかし、/subpage/ では index.htmlは読まずにエラーになる -- [[デフォルトのルートオブジェクトの指定 - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html]] CloudFront Functionsを使う方法: - [[index.html を追加してファイル名を含まない URL をリクエストする - Amazon CloudFront:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/example-function-add-index.html]] - [[CloudFront FunctionsをTerraformで書いてみた #AWS - Qiita:https://qiita.com/yoshuuua/items/08f6df850ef36ac41d4d]] Lambda@edgeを使う方法: --[[できた!S3 オリジンへの直接アクセス制限と、インデックスドキュメント機能を共存させる方法 | DevelopersIO:https://dev.classmethod.jp/articles/directory-indexes-in-s3-origin-backed-cloudfront/]] Custom OriginでS3バケットを指定 + CloudFrontの場合はサブページ以下のindex.htmlも読んでくれるようだ。(未確認) --[[CloudFront に S3 bucket のサブディレクトリパスのコンテンツを参照させる - Qiita:http://qiita.com/naoiwata/items/3c6626cbeacbb44d4aa8]]