Amazon CloudFront の Origin Access Identity を Origin Access Control (OAC) に切り替える。

記事タイトルとURLをコピーする

こんにちは。 技術課の山本です。 秋が近いですね。

先日、2022 年 8 月 25 日に 「Amazon CloudFront が Origin Access Control を提供するようになりました。」というアナウンスがありました。

S3 バケットで公開しているコンテンツを、CloudFront からのアクセスのみに制限するためにある、CloudFront の機能です。
今までは Origin Access Identity (OAI)という機能で実現していました。

参考:S3 に置いたコンテンツを CloudFront を利用 してインターネットに公開する方法まとめ ( A )CloudFront のオリジンに Amazon S3 バケットを使用する方法 - サーバーワークスエンジニアブログ

CloudFront + S3 の構成を新しく作成する場合には、Origin Access Control (OAC)を使用すると良さそうです。
一方で、Origin Access Identity も引き続き使えるようですので、切り替え等はまだ考えなくても良さそうです。
ただ、セキュリティ面の強化や、今後のことも考えると移行した方が良いでしょう。

新しく提供されている Origin Access Control では、以下の強化をしているようです。

  • AWS Signature Version 4(SigV4) を必要とする AWS リージョンでの POST メソッドを使用した HTTP および HTTPS リクエストに対応
  • SSE-KMS との連携に対応

詳細に書こうと思っていたら、公式さんがブログを書いてくれていました。
以下を参照していただければと思います。

aws.amazon.com

Terraform

Terraform を使っている場合は、以下の記事もご参照ください。
Amazon CloudFront の Origin Access Identity を Origin Access Control (OAC) に切り替える。Terraform編。 - サーバーワークスエンジニアブログ

Origin Access Identity を Origin Access Control (OAC) に切り替えてみる。

Origin Access Identity を Origin Access Control (OAC) に切り替えたい、という方のために、手順を確認してみました。
以下、手順です。

CloudFront の オリジン設定を見てみると "Origin access Identities" が "Legacy access Identities" に変わっています。

推奨(recommended)になっている "Origin access control settings (recommended)" を選択し「コントロール設定を作成」を押します。

「作成」を押します。設定値の詳細は上に載せた公式のブログを参照ください。

自動生成のS3バケットポリシー(Origin Access Control用)をコピーします。

適当なファイル名で保存しておきます。

CloudFront の オリジンになっているS3を、S3のサービス画面から確認し、バケットポリシー(Origin Access Identity用)をコピーします。

上で保存した自動生成のバケットポリシー(Origin Access Control用)に、今のバケットポリシー(Origin Access Identity用)をマージします。"Statement" セクション内"Sid"が1つ増えるようにしてマージする形になります。

サンプルです。testetetetetetetettest はオリジンのS3バケット名です。

{
  "Version": "2008-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipal",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::testetetetetetetettest/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/HOGEHOGE"
        }
      }
    },
    {
      "Sid": "1",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity OAIOAIOAIOIOI"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::testetetetetetetettest/*"
    }
  ]
}

マージしたバケットポリシーに更新します。これにより、CloudFront を更新するタイミングでこのWEBサイトに接続しているユーザーが、Origin Access Identity で 引き続きS3 オリジンのコンテンツに接続できます。

CloudFront のサービス画面に戻り、オリジンへの変更 (OAI→OAC) を保存します。

CloudFront が「デプロイ中」状態になります。この間は Origin Access Identity と Origin Access Control の両方を利用しているユーザーがいる状態になります。

サイトにアクセスできました。

少しすると、CloudFront の「デプロイ中」状態が消え、デプロイが完了しました。

S3 のバケットポリシーから、Origin Access Identity用のポリシーを削除します。

サンプルです。

{
  "Version": "2008-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipal",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::testetetetetetetettest/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/HOGEHOGE"
        }
      }
    }
  ]
}

サイトにアクセスできました。

まとめ

Origin Access Identity を Origin Access Control (OAC) に切り替える方法を紹介しました。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、サウナ、音楽鑑賞(J-Pops)、お笑い鑑賞(ラランド)