外墙 - AWS Cloud Development Kit (AWS CDK) v2

这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

外墙

Facade 是将资源与应用程序其他部分连接起来的类。每个 Facade 都以一种资源类型为目标。例如,之BucketGrants所以命名该类,是因为它授予对 Amazon S3 存储桶的访问权限。外墙可与 L1(CloudFormation级别)和 L2(基于意图)构造一起使用。

一些 Facade 已生成并可供大多数资源使用,例如指标和 reflections 类。对于需要自定义逻辑的资源,例如Grants类,则需要手动编写其他逻辑。

授予课程

最广泛使用的 Facades 是补助等级。它们允许您使用简单的方法授予对 AWS 资源的访问权限。例如,您可以用BucketGrants于 Amazon S3 存储桶和 Amazon TopicGrants SNS 主题。

L2 结构具有便于访问的grants属性。您也可以使用其出厂方法从 L1 构造中创建 Grants 类。以下示例显示了这两种方法:

TypeScript
import * as s3 from 'aws-cdk-lib/aws-s3'; import * as iam from 'aws-cdk-lib/aws-iam'; // myRole is an IAM role defined elsewhere in your app // Using grants on an L2 construct (via the grants property) const l2Bucket = new s3.Bucket(this, 'L2Bucket'); l2Bucket.grants.read(myRole); // Using grants on an L1 construct (via the factory method) const l1Bucket = new s3.CfnBucket(this, 'L1Bucket'); s3.BucketGrants.fromBucket(l1Bucket).read(myRole);
JavaScript
const s3 = require('aws-cdk-lib/aws-s3'); const iam = require('aws-cdk-lib/aws-iam'); // myRole is an IAM role defined elsewhere in your app // Using grants on an L2 construct (via the grants property) const l2Bucket = new s3.Bucket(this, 'L2Bucket'); l2Bucket.grants.read(myRole); // Using grants on an L1 construct (via the factory method) const l1Bucket = new s3.CfnBucket(this, 'L1Bucket'); s3.BucketGrants.fromBucket(l1Bucket).read(myRole);
Python
import aws_cdk.aws_s3 as s3 import aws_cdk.aws_iam as iam # my_role is an IAM role defined elsewhere in your app # Using grants on an L2 construct (via the grants property) l2_bucket = s3.Bucket(self, "L2Bucket") l2_bucket.grants.read(my_role) # Using grants on an L1 construct (via the factory method) l1_bucket = s3.CfnBucket(self, "L1Bucket") s3.BucketGrants.from_bucket(l1_bucket).read(my_role)
Java
import software.amazon.awscdk.services.s3.*; import software.amazon.awscdk.services.iam.*; // myRole is an IAM role defined elsewhere in your app // Using grants on an L2 construct (via the grants property) Bucket l2Bucket = new Bucket(this, "L2Bucket"); l2Bucket.getGrants().read(myRole); // Using grants on an L1 construct (via the factory method) CfnBucket l1Bucket = new CfnBucket(this, "L1Bucket"); BucketGrants.fromBucket(l1Bucket).read(myRole);
C#
using Amazon.CDK.AWS.S3; using Amazon.CDK.AWS.IAM; // myRole is an IAM role defined elsewhere in your app // Using grants on an L2 construct (via the grants property) var l2Bucket = new Bucket(this, "L2Bucket"); l2Bucket.Grants.Read(myRole); // Using grants on an L1 construct (via the factory method) var l1Bucket = new CfnBucket(this, "L1Bucket"); BucketGrants.FromBucket(l1Bucket).Read(myRole);
Go
import ( "github.com/aws/jsii-runtime-go" awss3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" ) // myRole is an IAM role defined elsewhere in your app l2Bucket := awss3.NewBucket(stack, jsii.String("L2Bucket"), nil) l2Bucket.Grants().Read(myRole, nil) l1Bucket := awss3.NewCfnBucket(stack, jsii.String("L1Bucket"), nil) awss3.BucketGrants_FromBucket(l1Bucket).Read(myRole, nil)

有关授权和权限的更多信息,请参阅权。

将 Facades 与 Mixins 一起使用

你可以将 Facades 与 Mixins 结合使用,在 L1 构造上获得类似 L2 的完整体验。使用 Mixins 来设置资源,使用 Facades 来授予访问权限:

TypeScript
import * as s3 from 'aws-cdk-lib/aws-s3'; import * as iam from 'aws-cdk-lib/aws-iam'; // Configure the resource with Mixins const bucket = new s3.CfnBucket(this, 'MyBucket') .with(new s3.mixins.BucketVersioning()) .with(new s3.mixins.BucketBlockPublicAccess()); // Grant permissions using a Facade const role = new iam.Role(this, 'MyRole', { assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), }); s3.BucketGrants.fromBucket(bucket).read(role);
JavaScript
const s3 = require('aws-cdk-lib/aws-s3'); const iam = require('aws-cdk-lib/aws-iam'); // Configure the resource with Mixins const bucket = new s3.CfnBucket(this, 'MyBucket') .with(new s3.mixins.BucketVersioning()) .with(new s3.mixins.BucketBlockPublicAccess()); // Grant permissions using a Facade const role = new iam.Role(this, 'MyRole', { assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), }); s3.BucketGrants.fromBucket(bucket).read(role);
Python
import aws_cdk.aws_s3 as s3 import aws_cdk.aws_iam as iam # Configure the resource with Mixins bucket = s3.CfnBucket(self, "MyBucket") \ .with_(s3.mixins.BucketVersioning()) \ .with_(s3.mixins.BucketBlockPublicAccess()) # Grant permissions using a Facade role = iam.Role(self, "MyRole", assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"), ) s3.BucketGrants.from_bucket(bucket).read(role)
Java
import software.amazon.awscdk.services.s3.*; import software.amazon.awscdk.services.iam.*; // Configure the resource with Mixins CfnBucket bucket = new CfnBucket(this, "MyBucket"); bucket.with(new BucketVersioning()); bucket.with(new BucketBlockPublicAccess()); // Grant permissions using a Facade Role role = Role.Builder.create(this, "MyRole") .assumedBy(new ServicePrincipal("lambda.amazonaws.com")) .build(); BucketGrants.fromBucket(bucket).read(role);
C#
using Amazon.CDK.AWS.S3; using Amazon.CDK.AWS.IAM; // Configure the resource with Mixins var bucket = new CfnBucket(this, "MyBucket"); bucket.With(new BucketVersioning()); bucket.With(new BucketBlockPublicAccess()); // Grant permissions using a Facade var role = new Role(this, "MyRole", new RoleProps { AssumedBy = new ServicePrincipal("lambda.amazonaws.com") }); BucketGrants.FromBucket(bucket).Read(role);
Go
bucket := awss3.NewCfnBucket(stack, jsii.String("MyBucket"), nil) bucket.With(awss3.NewBucketVersioning()) bucket.With(awss3.NewBucketBlockPublicAccess()) role := awsiam.NewRole(stack, jsii.String("MyRole"), &awsiam.RoleProps{ AssumedBy: awsiam.NewServicePrincipal(jsii.String("lambda.amazonaws.com"), nil), }) awss3.BucketGrants_FromBucket(bucket).Read(role, nil)
  • Mixins — 向 L1 和 L2 构造添加可重复使用的功能。

  • 权-在资源之间授予权限。

  • 构造 — 了解 L1、L2 和 L3 结构。