【アップデート】Amazon CloudFront で Origin Access Control (OAC) が利用開始されました!
2022.8.26
Topics
おはようございます。Mr.oldtypeです。
基本的に夜行性の僕ですが、今週は妻に釣られ毎日6時半に起きてTHE TIME,を見ることが出来てます。すごいえらい。
んでたまたまTwitterを見てて下記アップデートを目撃しました。
Amazon CloudFront launches Origin Access Control (OAC)
OAC…?OAIの進化系…?もしやこれ神アップデートなのでは?と思いさっそく調べてみました。
OAI と何が違うのか
一番の変更点は「S3のサーバーサイド暗号化にカスタマー管理キーが使えるようになったこと」です。所謂SSE-KMSを施したS3オブジェクトをCloudFront経由で配信できるようになりました。
OAIでもSSE-S3を使ってオブジェクトの暗号化を行えてましたが、CloudTrailに複合証跡が残らないなどデメリットもありました。
これでより安心してS3を暗号化することが出来ます。
やってみた
リソースをつくります
まず今までと同じ要領でCloudFront+S3の環境を構築します。
terraformを使ってサクッと作りました。
cloudfront.tf
data "aws_cloudfront_origin_request_policy" "managed_allviewer" { name = "Managed-AllViewer" } data "aws_cloudfront_cache_policy" "CachingOptimized" { name = "Managed-CachingOptimized" } resource "aws_cloudfront_distribution" "distribution" { origin { domain_name = aws_s3_bucket.bucket.bucket_regional_domain_name origin_id = aws_s3_bucket.bucket.id s3_origin_config { origin_access_identity = aws_cloudfront_origin_access_identity.oai.cloudfront_access_identity_path } } enabled = true default_root_object = "index.html" default_cache_behavior { allowed_methods = ["GET", "HEAD"] cached_methods = ["GET", "HEAD"] target_origin_id = aws_s3_bucket.bucket.id cache_policy_id = data.aws_cloudfront_cache_policy.CachingOptimized.id viewer_protocol_policy = "redirect-to-https" } restrictions { geo_restriction { restriction_type = "whitelist" locations = ["JP"] } } viewer_certificate { cloudfront_default_certificate = true } } resource "aws_cloudfront_origin_access_identity" "oai" {}
s3.tf
resource "aws_s3_bucket" "bucket" { bucket = "${var.prj}-${var.env}-s3" } resource "aws_s3_bucket_acl" "bucket_acl" { bucket = aws_s3_bucket.bucket.bucket acl = "private" } resource "aws_s3_bucket_policy" "bucket" { bucket = aws_s3_bucket.bucket.id policy = data.aws_iam_policy_document.oai.json } data "aws_iam_policy_document" "oai" { statement { sid = "Allow CloudFront" effect = "Allow" principals { type = "AWS" identifiers = [aws_cloudfront_origin_access_identity.oai.iam_arn] } actions = [ "s3:GetObject" ] resources = [ "${aws_s3_bucket.bucket.arn}/*" ] } }
provider.tfとvariables.tfは省略します。
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
できました。
コンソールで確認
CloudFrontのオリジンを編集から確認してみます。
OAIが設定されてました。うん?なんかLegacyとか書いてあって新しいrecommendedが生えてますね。こちらが今回のアップデートOACさんです。
最初は「コントロール設定を作成」からOACを作成します。
作成後「変更を保存」する前に(後でもいいですが)OAC用のバケットポリシーをコピーしてオリジンS3に貼り付けます。ここはまだ手動でやる必要があるみたいです。
バケットポリシーの更新が終わったらCloudFrontのディストリビューションドメイン名でアクセスしてみましょう。
OAIの時と同様問題なくアクセス出来てると思います。
SSE-KMSを試してみる
これだけだと面白くないので、SSE-KMSを使って暗号化したS3オリジンを使ってみましょう。
まずカスタマーマネージドキーを用意します。AWSマネージドキーではキーポリシーの編集が出来ないので、今回は使うことができません。
参考:AWS Key Management Service – キーの作成
この時、必ずキータイプは対象型を選択してください。S3は非対称キーをサポートしていないため、オブジェクトのアップロードが出来なくなります。
参考:Amazon Simple Storage Service – AWS Key Management Service (SSE-KMS) でサーバー側の暗号を使ってデータを保護します。
カスタマーCMKを作成したら、キーポリシーの編集を押し、CloudFrontサービスへアクセスを許可します。
{ "Id": "key-consolepolicy-1", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:user/YOUR_IAM_USER" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "Service": [ "cloudfront.amazonaws.com" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey*" ], "Resource": "*" "Condition":{ "StringEquals":{ "aws:SourceArn”: “arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" } } } ] }
Condition属性はなくても大丈夫ですが、あると任意のCloudFrontディストリビューションのみにアクセス許可が出来るのでよりセキュアです。
キーポリシーの編集が完了したら、S3のプロパティ画面で先ほどのカスタマーCMKのARNをコピペします。
完了したらオブジェクトを再度アップロードし、CloudFrontのディストリビューションドメイン名でアクセスしてみましょう。
OAIの場合は下記のようにAccessDeniedになってしまいますが…
OACにすることでページを表示することができました。
まとめ
OAIはもうレガシーとのことなので、これからはOACを使いましょう。
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitterクラウドを楽しくする、をテーマに活動しています。 2021/2022 APN Top Engineer。 でしょうね、ミスター・オールドタイプ。
Recommends
こちらもおすすめ
-
Amazon CloudFrontでReactを動かす
2024.3.26
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28
AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16