web-dev-qa-db-ja.com

AWS CDKでS3 BucketPolicyを追加する方法

このクラディーフォームピースをCDKに翻訳したい:

Type: AWS::S3::BucketPolicy
Properties:
  Bucket:
    Ref: S3BucketImageUploadBuffer
  PolicyDocument:
    Version: "2012-10-17"
    Statement:
      Action:
        - s3:PutObject
        - s3:PutObjectAcl
      Effect: Allow
      Resource:
        - ...
 _

ここでのドキュメント 、私はポリシー文書自体を提供する方法はありません。

@Thomas Wagnerの答えを建てる、これは私がこれをした方法です。私はバケットを特定のIP範囲に制限しようとしていました:

_import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as s3Deployment from '@aws-cdk/aws-s3-deployment';
import * as iam from '@aws-cdk/aws-iam';

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

    // Bucket where frontend site goes.
    const mySiteBucket = new s3.Bucket(this, 'mySiteBucket', {
      websiteIndexDocument: "index.html"
    });

    let ipLimitPolicy = new iam.PolicyStatement({
      actions: ['s3:Get*', 's3:List*'],
      resources: [mySiteBucket.arnForObjects('*')],
      principals: [new iam.AnyPrincipal()]
    });
    ipLimitPolicy.addCondition('IpAddress', {
      "aws:SourceIp": ['1.2.3.4/22']
    });
    // Allow connections from my CIDR
    mySiteBucket.addToResourcePolicy(ipLimitPolicy);


    // Deploy assets
    const mySiteDeploy = new s3Deployment.BucketDeployment(this, 'deployAdminSite', {
      sources: [s3Deployment.Source.asset("./mysite")],
      destinationBucket: mySiteBucket
    });

  }
}
_

ARNSやPrincipalsを直接指定するのではなく、 s3.arnforObjects()iam.anyprincipal() ヘルパー関数を使用することができました。

私がバケットに展開したいアセットは、mysiteというディレクトリ内のプロジェクトディレクトリのルートに保持され、_s3Deployment.BucketDeployment_への呼び出しから参照されます。これは、ビルドプロセスがアクセスできる任意のディレクトリです。

3
cam8001

元の質問に従って、@ Thomas-Wagnerからの答えは行く方法です。

ここで誰かが来るならば、Bucketに依存関係を描くことなくCloudFrontディストリビューションのバケットポリシーを作成する方法については、L1 Construct CfnBucketPolicy(下記のラフC#例)を使用する必要があります。

    IOriginAccessIdentity originAccessIdentity = new OriginAccessIdentity(this, "Origin-access-identity", new OriginAccessIdentityProps
    {
        Comment = "Origin Access Identity",
    });

    PolicyStatement bucketAccessPolicy = new PolicyStatement(new PolicyStatementProps
    {
        Effect = Effect.ALLOW,
        Principals = new[]
        {
            originAccessIdentity.GrantPrincipal
        },
        Actions = new[]
        {
            "s3:GetObject",
        },
        Resources = new[]
        {
            Props.OriginBucket.ArnForObjects("*"),
        }
    });

    _ = new CfnBucketPolicy(this, $"bucket-policy", new CfnBucketPolicyProps
    {
        Bucket = Props.OriginBucket.BucketName,
        PolicyDocument = new PolicyDocument(new PolicyDocumentProps
        {
            Statements = new[]
            {
                bucketAccessPolicy,
            },
        }),
    });
 _

どこ Props.OriginBucketIBucket(ただのバケット)のインスタンスです。

1
jackofallcode