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)されています。
Origin access control settings (recommended)を選択(OAC)して、「コントロール設定を作成」をクリックします。
Create control settingの画面が表示されます。オリジンタイプがS3であることを確認して、作成をクリックします。
Origin access controlにS3バケットのURLが表示されます。Origin typeがS3であることも表示されます。
変更を保存をクリックします。
CloudFrontの一般タブを表示します。最終変更日がデプロイとなり、OACへの変更がデプロイ中であることが分かります。
しばらくすると、最終変更日からデプロイ表示が消えます。私の環境では、4分程度でデプロイが完了しました。
接続確認
ブラウザから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の新機能を利用したい方は、移行を検討してみてはいかがでしょうか