[AWS CDK]aws_cloudfront.Distributionで設定されるOAIを削除する

CDKでCloudFrontのオリジンにS3を指定するとデフォルトのアクセス制御にはOAIが設定され、S3にOAIのバケットポリシーが追加されます。
OAIは既にレガシーであり、実際のアクセス制御にはより新しいOACを使うため、デフォルトで設定されるOAIを削除する方法を調べました。

### 結論
- CloudFront側
```addPropertyOverride```でOAIの設定を空にする。
```typescript
const cfnDistribution = hogeDistribution.node.defaultChild as aws_cloudfront.CfnDistribution;
cfnDistribution.addPropertyOverride(
  "DistributionConfig.Origins.0.S3OriginConfig.OriginAccessIdentity",
  ""
);
```

- S3側
```addPropertyDeletionOverride```でS3のバケットポリシーからOAIに対応する箇所を削除する。
```typescript
const policyOverride = hogeBucket.node.findChild("Policy").node.defaultChild as CfnBucket;
policyOverride.addPropertyDeletionOverride("PolicyDocument.Statement.0");
```


### CDK全体
```typescript
import {
  Stack,
  StackProps,
  aws_s3,
  aws_iam,
  aws_cloudfront,
  aws_cloudfront_origins,
  aws_s3_deployment
} from 'aws-cdk-lib';
import { CfnBucket } from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';

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

    // S3 Bucket作成
    const hogeBucket = new aws_s3.Bucket(this, "hogeBucket", {
      bucketName: `hoge-${this.account}-${this.region}`,
      publicReadAccess: false,
      blockPublicAccess: aws_s3.BlockPublicAccess.BLOCK_ALL,
    });

    // S3ファイルアップロード(index.html)
    new aws_s3_deployment.BucketDeployment(this, "FileUploadS3", {
      sources: [aws_s3_deployment.Source.asset("upload_test")],
      destinationBucket: hogeBucket
    });

    // CloudFront ディストリビューション作成
    const hogeDistribution = new aws_cloudfront.Distribution(this, "hogeDistribution", {
      defaultRootObject: "index.html",
      defaultBehavior: {
        origin: new aws_cloudfront_origins.S3Origin(hogeBucket)
      },
    });

    // S3 OAC作成
    const cfnS3Oac = new aws_cloudfront.CfnOriginAccessControl(this, "S3_OAC", {
      originAccessControlConfig: {
        name: "OAC for S3",
        originAccessControlOriginType: "s3",
        signingBehavior: "always",
        signingProtocol: "sigv4"
      }
    });

    // CloudFront OAI削除(S3)
    const cfnDistribution = hogeDistribution.node.defaultChild as aws_cloudfront.CfnDistribution;
    cfnDistribution.addPropertyOverride(
      "DistributionConfig.Origins.0.S3OriginConfig.OriginAccessIdentity",
      ""
    );

    // CloudFront OAC追加(S3)
    cfnDistribution.addPropertyOverride(
      "DistributionConfig.Origins.0.OriginAccessControlId",
      cfnS3Oac.attrId
    );

    // バケットポリシーにOACを追加
    hogeBucket.addToResourcePolicy(new aws_iam.PolicyStatement({
      actions: ['s3:GetObject'],
      effect: aws_iam.Effect.ALLOW,
      resources: [hogeBucket.arnForObjects("*")],
      principals: [new aws_iam.ServicePrincipal("cloudfront.amazonaws.com")],
      conditions: {
        StringEquals: {
          "AWS:SourceArn": `arn:aws:cloudfront::${this.account}:distribution/${hogeDistribution.distributionId}`
        }
      }
    }));

    // バケットポリシーからOAIを削除
    const policyOverride = hogeBucket.node.findChild("Policy").node.defaultChild as CfnBucket;
    policyOverride.addPropertyDeletionOverride("PolicyDocument.Statement.0");
  }
}
```
</details>


### バケットポリシーの確認
- ```addPropertyDeletionOverride```追加前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770153/f4deb380-dc7d-20db-799a-14d62d5a23fc.png)


- ```addPropertyDeletionOverride```追加後
OAIのバケットポリシーが削除されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770153/dc616cac-a4d8-7b4d-e082-7997a77c4833.png)