このクラディーフォームピースを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
_への呼び出しから参照されます。これは、ビルドプロセスがアクセスできる任意のディレクトリです。
元の質問に従って、@ 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.OriginBucket
IBucket
(ただのバケット)のインスタンスです。