LoginSignup
4
3

More than 3 years have passed since last update.

CDKでS3バケットポリシーを設定する

Posted at

CDKでS3のリソースを作成する際にバケットリソースを設定する実装コードのメモ
今回はFirebaseで作成したHostingアプリと特定のIPからのみAWSのS3バケットのオブジェクトを取得できるようにポリシーを設定します。

cdk-stack.ts
import cdk = require('@aws-cdk/core')
import iam = require('@aws-cdk/aws-iam')
import s3 = require('@aws-cdk/aws-s3')

export class TestStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    // S3
    const testBucket = new s3.Bucket(this, 'test-bucket-id', {
      bucketName: 'test-bucket'
    })

    const testBucketPolicy = new iam.PolicyStatement({
      effect: iam.Effect.DENY,
      actions: ['s3:GetObject'],
      principals: [new iam.ArnPrincipal('*')],
      resources: [
        testBucket.bucketArn + '/*'
      ],
      conditions: {
        // リクエストのヘッダーに含まれるrefererが下記に含まれないものをDENY
        'StringNotLike': {
          'aws:Referer': [
            'https://app-name.firebaseapp.com/*',
          ]
        },
        // リクエスト元のIPが下記に含まれないものをDENY
        'NotIpAddress': {
          'aws:SourceIp': [
            '123.456.78.90',
          ]
        }
      }
    })
    testBucket.addToResourcePolicy(testBucketPolicy)

この設定で特に注意すべき点としてはConditionsで設定されているものはAND条件ではなくOR条件であるということ。

上記のような設定でオブジェクトの取得を自宅のIPからのアクセス(検証用)とfirebaseのhostingアプリからのアクセスだけを許可するように設定できました。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3