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アプリからのアクセスだけを許可するように設定できました。