📌

AWS CDK v2 事始め(2):S3バケットにバケットポリシーを付与する

2023/01/09に公開

CDK(の勉強)つづき

AWS CDKを使えるようになりたくて勉強はじめました。前回はS3バケットの作成をしました。今回はバケットポリシーを付与します。

== 2023-09-09 追記 CDK勉強まとめ ==

==================================

スクリプトの更新

lib/cdk-workshop-stack.tsを以下のように更新します。ーーー 追加 ーーーの箇所が追記した箇所です。(バケットポリシーはこちらを参考にさせて頂きました)

lib/cdk-workshop-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as iam from 'aws-cdk-lib/aws-iam'; // ーーー 追加 ーーー

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

    // const BucketName01 = this.node.tryGetContext("BucketName01")
    const BucketName02 = this.node.tryGetContext("BucketName02")

    const bucket = new s3.Bucket(this, 'CreateBucket', {
      bucketName: BucketName02,
      versioned: true
    });
    
    // ーーー↓↓ 追加 ↓↓ーーー //
    const bucke_policy = new iam.PolicyStatement({
      effect: iam.Effect.DENY,
      actions: ['s3:GetObject'],
      principals: [new iam.ArnPrincipal('*')],
      resources: [
        bucket.bucketArn + '/*'
      ],
      conditions: {
        'StringNotLike': {
          'aws:Referer': [
            'https://app-name.firebaseapp.com/*',
          ]
        },
        'NotIpAddress': {
          'aws:SourceIp': [
            '10.10.10.10',
          ]
        }
      }
    })
    bucket.addToResourcePolicy(bucke_policy);
    // ーーー↑↑ 追加 ↑↑ーーー //
  }
}

更新箇所の確認

cdk diffの結果です。

iam0001:~/environment/cdk-workshop (master) $ cdk diff
Stack CdkWorkshopStack
IAM Statement Changes
┌───┬────────────────────────────────┬────────┬──────────────┬───────────┬────────────────────────────────┐
│   │ Resource                       │ Effect │ Action       │ Principal │ Condition                      │
├───┼────────────────────────────────┼────────┼──────────────┼───────────┼────────────────────────────────┤
│ + │ ${CreateBucket.Arn}/*          │ Deny   │ s3:GetObject │ AWS:*     │ "StringNotLike": {             │
│   │                                │        │              │           │   "aws:Referer": [             │
│   │                                │        │              │           │     "https://app-name.firebase │
│   │                                │        │              │           │ app.com/*"                     │
│   │                                │        │              │           │   ]                            │
│   │                                │        │              │           │ },                             │
│   │                                │        │              │           │ "NotIpAddress": {              │
│   │                                │        │              │           │   "aws:SourceIp": [            │
│   │                                │        │              │           │     "10.10.10.10"              │
│   │                                │        │              │           │   ]                            │
│   │                                │        │              │           │ }                              │
└───┴────────────────────────────────┴────────┴──────────────┴───────────┴────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Parameters
[+] Parameter BootstrapVersion BootstrapVersion: {"Type":"AWS::SSM::Parameter::Value<String>","Default":"/cdk-bootstrap/hnb659fds/version","Description":"Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"}

Conditions
[+] Condition CDKMetadata/Condition CDKMetadataAvailable: {"Fn::Or":[{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"af-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-northwest-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"sa-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-2"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-2"]}]}]}

Resources
[+] AWS::S3::Bucket CreateBucket CreateBucketEFE7EF15 
[+] AWS::S3::BucketPolicy CreateBucket/Policy CreateBucketPolicyD6AB31A8 

Other Changes
[+] Unknown Rules: {"CheckBootstrapVersion":{"Assertions":[{"Assert":{"Fn::Not":[{"Fn::Contains":[["1","2","3","4","5"],{"Ref":"BootstrapVersion"}]}]},"AssertDescription":"CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."}]}}

****************************************************
*** Newer version of CDK is available [2.59.0]   ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************

デプロイ結果

cdk deployでデプロイされたS3バケットのバケットポリシーを見てみると、期待したポリシーが記載されていました。

補足

S3バケットにバケットポリシーを付与する処理について

addToResourcePolicyでバケットポリシーを付与するらしい。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html#addwbrtowbrresourcewbrpolicypermission

バケットポリシーの作成について

iamPolicyStatementクラスを使うそうです。S3でさがしていたのですが、ポリシーなのでiamになるんですね。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.PolicyStatement.html

余談

前述のcdk diffの結果にNewer version of CDK is available [2.59.0]とありました。
最近(←いつ?)CDKの最新バージョン2.55.1をインストールしたはずですが、今は2.59.0にまで上がってるようです。CDKのバージョンアップの頻度は高そうですね。

Discussion