Amazon CloudFront OAIからOACに移行する

概要


CloudFrontからS3にあるコンテントへのアクセス制御に、新たにOACが追加されました。公式に移行方法が紹介されているので、それに基づいてOAIからOACに移行してみました。
OAI(Origin Access Identity)とOAC(Origin Access Control)を簡単に説明すると、S3にあるコンテントへのアクセスをCloudFront経由に限定するアクセス制御方法です。




S3バケットポリシーの編集

最初にAmazon S3のバケットポリシーを編集します。
編集前のS3バケットポリシーは、以下になります。OAIのアクセス許可が記載されています。
<origin access identity ID>、<S3 bucket name>は、環境によって異なります。

 1{
 2    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Sid": "OAI",
 6            "Effect": "Allow",
 7            "Principal": {
 8                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>"
 9            },
10            "Action": "s3:GetObject",
11            "Resource": "arn:aws:s3:::<S3 bucket name>/*"
12        }
13    ]
14}

編集後のS3バケットポリシーが、以下になります。"Statement"にOACのアクセス許可("Sid"が"AllowCloudFrontServicePrincipalReadOnly"の部分)を追記しています。
必要に応じて、"Action"を編集します。
<AWS account ID>、<CloudFront distribution ID>も、環境によって異なります。

 1{
 2    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
 6            "Effect": "Allow",
 7            "Principal": {
 8                "Service": "cloudfront.amazonaws.com"
 9            },
10            "Action": "s3:GetObject",
11            "Resource": "arn:aws:s3:::<S3 bucket name>/*",
12            "Condition": {
13                "StringEquals": {
14                    "AWS:SourceArn": "arn:aws:cloudfront::<AWS account ID>:distribution/<CloudFront distribution ID>"
15                }
16            }
17        },
18        {
19            "Sid": "OAI",
20            "Effect": "Allow",
21            "Principal": {
22                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>"
23            },
24            "Action": "s3:GetObject",
25            "Resource": "arn:aws:s3:::<S3 bucket name>/*"
26        }
27    ]
28}

OACの作成

次にAmazon CloudFrontのオリジンのアクセス方法を編集します。
編集前のS3バケットアクセスは、以下になります。Legacy access identitiesが選択(OAI)されています。

S3バケットアクセス


Origin access control settings (recommended)を選択(OAC)して、「コントロール設定を作成」をクリックします。

S3バケットアクセス


Create control settingの画面が表示されます。オリジンタイプがS3であることを確認して、作成をクリックします。

コントロール設定を作成


Origin access controlにS3バケットのURLが表示されます。Origin typeがS3であることも表示されます。
変更を保存をクリックします。

S3バケットアクセス


CloudFrontの一般タブを表示します。最終変更日がデプロイとなり、OACへの変更がデプロイ中であることが分かります。

CloudFront 一般タブ


しばらくすると、最終変更日からデプロイ表示が消えます。私の環境では、4分程度でデプロイが完了しました。

CloudFront 一般タブ


接続確認

ブラウザからURLに接続できるか確認します。CloudFrontのキャッシュを削除してから接続確認を行うと、接続確認の正確性が増します。


S3バケットポリシーの削除(OAIの部分)

不要になったOAIのアクセス許可(ここでは"Sid"が"OAI"の部分)を削除します。
※削除しなくても、動作に支障はありません。

 1{
 2    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
 6            "Effect": "Allow",
 7            "Principal": {
 8                "Service": "cloudfront.amazonaws.com"
 9            },
10            "Action": "s3:GetObject",
11            "Resource": "arn:aws:s3:::<S3 bucket name>/*",
12            "Condition": {
13                "StringEquals": {
14                    "AWS:SourceArn": "arn:aws:cloudfront::<AWS account ID>:distribution/<CloudFront distribution ID>"
15                }
16            }
17        },
18        {
19            "Sid": "OAI",
20            "Effect": "Allow",
21            "Principal": {
22                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>"
23            },
24            "Action": "s3:GetObject",
25            "Resource": "arn:aws:s3:::<S3 bucket name>/*"
26        }
27    ]
28}

削除後のS3バケットポリシーが、以下になります。

 1{
 2    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
 6            "Effect": "Allow",
 7            "Principal": {
 8                "Service": "cloudfront.amazonaws.com"
 9            },
10            "Action": "s3:GetObject",
11            "Resource": "arn:aws:s3:::<S3 bucket name>/*",
12            "Condition": {
13                "StringEquals": {
14                    "AWS:SourceArn": "arn:aws:cloudfront::<AWS account ID>:distribution/<CloudFront distribution ID>"
15                }
16            }
17        }
18    ]
19}

接続確認2

ブラウザからURLに接続できるか確認します。


まとめ

若干面倒な部分はありますが、OACへの移行はそれほど難しくありませんでした。公式でもアナウンスされていますが、OAIも引き続きサポートされます。
OACからサポートされたSSE-KMSの新機能を利用したい方は、移行を検討してみてはいかがでしょうか


参考