CloudFront オリジンアクセスアイデンティティでクロスアカウントなS3オリジンへのアクセスを制限する

2018.03.07

こんにちは、菊池です。

今回も小ネタで。CloudFrontを利用したS3コンテンツの配信では、CloudFrontとS3を異なるアカウントで構成することも可能です。

このとき、S3オリジンへの直接アクセスを許可せず、必ずCloudFrontを経由させてアクセスさせたい、ということもあるかと思います。その場合、CloudFrontとS3が同じアカウントにあるケースに加えて一手間がありましたので紹介します。

CloudFrontからS3へのアクセス許可

S3バケットへのアクセスを制限する場合、CloudFrontからはOrigin Access Identity(OAI)という認証情報を使ってS3へアクセスします。S3バケットはそのOAIに対しアクセス許可を与えることでバケット内のオブジェクトが参照できます。

CloudFrontとS3が同じアカウントにある場合には、CloudFrontのマネジメントコンソールからディストリビューションを作成する際にOAI作成/ポリシー適用を自動で設定することも可能です。しかし、クロスアカウントの場合には各アカウントで設定が必要です。

やってみた

OAIの作成(アカウントA)

まずはCloudFrontのあるアカウントAで、OAIを作成します。CloudFrontマネジメントコンソールのメニューから[Origin Access Identity]を選択し、[Create OAI]を選びます。

任意のコメントを入力して、作成します。

作成したOAIの[Amazon S3 Canonical User ID]の文字列が、認証情報になります。

S3オリジンのバケットポリシーの設定(アカウントB)

S3オリジンのあるアカウントB側で、バケットポリシーを編集します。

先ほど作成した、OAIを許可するバケットポリシーです。CanonicalUserにOAIのAmazon S3 Canonical User IDを指定します。また、バケット名も環境に合わせて変更してください。

{
    "Version": "2012-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": " Grant a CloudFront Origin Identity access to support private content",
            "Effect": "Allow",
            "Principal": {
                "CanonicalUser": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.example.com/*"
        }
    ]
}

CloudFrontディストリビューション/オリジンの設定(アカウントA)

最後に、CloudFrontです。ディストリビューションのオリジンを設定します。

  • [Origin Domain Name] には(オリジンバケット名).s3.amazonaws.comを入力(他のアカウントのため選択肢には出てきません)
  • [Restrict Bucket Access] を [Yes]
  • [Origin Access Identity] に [Use an Existing Identity] を選択し最初に作成したOAIを指定
  • [Grant Read Permissions on Bucket] は [No, I Will Update Permissions]

設定が反映されたら、URLにアクセスして確認しましょう。

まとめ

クロスアカウントでのCloudFront - S3のアクセス権の設定方法を紹介しました。

S3はクロスアカウントで利用することが多いサービスの1つなので、アクセス権限まわりをしっかりと使いこなしたいですね。

参考情報