Amazon CloudFrontの従来のOAIから新しくなったOACに移行してみた

Amazon CloudFrontからS3へのアクセス制御として、新たにOrigin Access Controlが利用できるようになったので、従来のOrigin Access Identityから移行してみました。
2022.11.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

みなさん、こんにちは。 ネクストモードのあゆです。

Amazon CloudFrontにOrigin Access Control(以下、OAC)の機能が追加されました。従来のOrigin Access Identity(以下、OAI)ではS3側のSSE-KMSに対応していない、 S3に対する動的なリクエストがサポートされていない、などの制限事項がありましたがOACによりそれらをカバーしています。

詳細は下記エントリーをご覧ください。

本記事では新規でOACを作成し、既存環境で使用しているOAIと差し替えて問題なくアクセスできるところまでやってみようと思います!

書かないこと

既存環境のAmazon CloudFront + S3 with OAI構成の構築手順は省かせていただきます。
手順の詳細については下記エントリーを参照してください。

やってみた

手順は以下の通りです。

  • 既存環境のS3バケットポリシーにOACのアクセス許可を追記する
  • OACを作成し、OAIとOACを差し替える
  • アクセス確認をする

先にOACを作成しCloudFront Distributionのオリジンの編集画面から既存のOAIと差し替え、後からS3のバケットポリシーを追記もしくは修正する方法もあります。
その場合ダウンタイムや切り戻しの手間が発生してしまうので、実際の移行をイメージして上記手順を踏んでやっていきます。

既存環境のS3バケットポリシーにOACのアクセス許可を追記する

現状、バケットポリシーの中身は以下のようになっています。
※OAIからのアクセス許可を分かりやすくするためSidAllowLegacyOAIReadOnlyに変更しています。

確認のため、CloudFront DistributionのアクセスURLからS3バケット内のコンテンツにアクセスしてみます。

次にS3のオブジェクトURLから直接アクセスできないことを確認します。

OAIを利用してAmazon CloudFrontからのみS3バケット内のコンテンツにアクセスできることが確認できました。
次にOACからのアクセスを許可する下記JSONをバケットポリシーに追記します。
バケット名およびCloudFront Distribution ARNは適宜修正してください。


{
    "Sid": "AllowCloudFrontServicePrincipalReadOnly",
    "Effect": "Allow",
    "Principal": {
        "Service": "cloudfront.amazonaws.com"
    },
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::S3バケット名/*",
    "Condition": {
        "StringEquals": {
            "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID"
        }
    }
}

追記後のバケットポリシーがこちら


{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::nextmode-ayu-test/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::xxxxxxxxxxxx:distribution/xxxxxxxxxxxxxx"
                }
            }
        },
        {
            "Sid": "AllowLegacyOAIReadOnly",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity xxxxxxxxxxxx"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::nextmode-ayu-test/*"
        }
    ]
}

これでOAIおよびOACからのアクセスを許可したバケットポリシーの完成です。
今後、OACへの移行作業でトラブルがあった場合でもOAIへの切り戻しが容易にできるようになります。

OACを作成する

それではOACを作成していきましょう。
まずはAmazon CloudFrontのコンソール画面を開きます。
続いてディストリビューションから「ディストリビューション名」→「オリジン」タブ→「オリジン名」→「編集」の順に選択していきます。

S3バケットアクセスの設定を見ると選択肢に、Public、Origin access control settings (recommended)、Legacy access identitiesの3種類が確認できます。

※執筆時点(2022/11/28)での内容となっているため、今後のアップデートによりUIが変わる可能性があります。

Legacy access identitiesはOAIを指し、設定上からもレガシーの扱いになっていることが分かります。
そしてOrigin access control settings (recommended)が今回設定したいOACです。カッコ内にrecommendedと記載があるように、AWSではこちらを使用することが推奨されていますね。
Origin access control settings (recommended)を選択すると作成済みのOACをドロップダウンから選べるようになりますが、まだOACを作成していません。ドロップダウン横の「コントロールを作成」から、新たにOACを作成していきます。

「コントロールを作成」をクリックすると画面遷移することなくOACの作成画面が表示されます。
名前の欄は自動的にオリジンドメインが入力されておりますが、変更する理由もないのでこのまま作成していきます。

余談ですがOACの名前はアカウント単位で一意である必要があるため、既にあるOACと同じ名前を入力して作成ボタンを押すとエラーメッセージが表示されます。

OACを作成したら自動でOrigin access controlのドロップダウンに選ばれているので、そのまま「変更を保存」を押します。
ディストリビューションの一般タブをクリックし、詳細の最終変更日がデプロイから変更日が表示されるまで待ちます。

アクセス確認をする

それではアクセス確認をしていきましょう。
CloudFront DistributionのアクセスURLからS3バケット内のコンテンツにアクセスしてみます。

無事にアクセスすることができました。
続いてバケットポリシーをOACからのアクセスのみ許可するよう編集しアクセス確認をしてみましょう。
バケットポリシーは下記のとおりです。


{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::nextmode-ayu-test/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::xxxxxxxxxxxx:distribution/xxxxxxxxxxxxxx"
                }
            }
        }
    ]
}

それではアクセスしてみます。

問題なくアクセスできました。

おわりに

いかがだったでしょうか。
実際に手を動かしてみて、OAIからOACへの移行は非常にシンプルで簡単な印象を受けました。
既に開設されているリージョンでは引き続きOAIを使用することができますが、要件によってはOACに移行したい場面も出てくるかと思います。その際はこの記事が少しでもお役に立てれば幸いです。
最後まで読んで頂きありがとうございました!

参考リンク

ネクストモードについて

ネクストモード株式会社は東日本電信電話株式会社とクラスメソッド株式会社で設立したクラウドカンパニーです。「クラウドであたらしい働き方を」というメッセージを掲げ、さまざまなクラウド技術や製品を組み合わせて企業の働き方の当たり前を変えていくことを目指しています。クラウドやSaaSのご利用に関してお困りごとがあれば、ネクストモードまでぜひお問い合わせください。