AWS S3 部署构造库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
这个库允许充入带有.zip文件内容的 S3 桶 从其他 S3 桶或从本地磁盘.
以下示例定义了可公开访问的 S3 桶, 并带有网页托管功能 启用并输入磁盘上的本地目录.
const websiteBucket = new s3.Bucket(this, 'WebsiteBucket', {
websiteIndexDocument: 'index.html',
publicReadAccess: true,
});
new s3deploy.BucketDeployment(this, 'DeployWebsite', {
sources: [s3deploy.Source.asset('./website-dist')],
destinationBucket: websiteBucket,
destinationKeyPrefix: 'web/static', // optional prefix in destination bucket
});
这是在引擎盖下发生的事情:
- 当部署此堆栈时( 要么通过
cdk deploy或通过CI/CD) 本地目录中的内容website-dist目录将存档并上传 到一个中介资产桶。 如果不止一个来源,他们会 个人上传. - 这个
BucketDeployment构造自定义 CloudFormation 资源 类型Custom::CDKBucketDeployment输入模板。 源桶/钥匙 用于指向资产桶. - 自定义资源下载 .zip 归档,取出并发行
aws s3 sync --delete攻击目的地桶(在这种情况下)websiteBucket) (中文(简体) ). 如果有一个以上的来源,来源将是 在此步骤下下载并合并了部署前.
如果您在另一个构造中引用填充的桶,则取决于
文件已经存在, 请确定使用 deployment.deployedBucket这个
将确保在使用资源之前完成水桶部署
创建桶 :
declare const websiteBucket: s3.Bucket;
const deployment = new s3deploy.BucketDeployment(this, 'DeployWebsite', {
sources: [s3deploy.Source.asset(path.join(__dirname, 'my-website'))],
destinationBucket: websiteBucket,
});
new ConstructThatReadsFromTheBucket(this, 'Consumer', {
// Use 'deployment.deployedBucket' instead of 'websiteBucket' here
bucket: deployment.deployedBucket,
});
支助来源
用于桶部署的源类型有:
- 本地 .zip 文件 :
s3deploy.Source.asset('/path/to/local/file.zip') - 本地目录 :
s3deploy.Source.asset('/path/to/local/directory') - 又一个桶:
s3deploy.Source.bucket(bucket, zipObjectKey) - 字符串数据 :
s3deploy.Source.data('object-key.txt', 'hello, world!')(支助) 部署时间值(中文(简体) ) - JSON数据 :
s3deploy.Source.jsonData('object-key.json', { json: 'object' })(支助) 部署时间值(中文(简体) )
要从一个文件创建源, 您可以通过 AssetOptions 排除
除单一文件外的所有文件 :
- 单一文件 :
s3deploy.Source.asset('/path/to/local/directory', { exclude: ['**', '!onlyThisFile.txt'] })
重要性 这个 aws-s3-deployment 模块仅用于
来自可信来源的zip文件 。 由 CDK CLI 捆绑的目录( 通过使用
Source.asset() 在目录上)是安全的. 使用时 Source.asset() 或者说
Source.bucket() 引用已有的zip文件,确保您信任
文档中您正在引用 。 来自不信任来源的分页可能能够执行
此模块使用的 Lambda 函数中的任意代码,并使用其权限
在 S3 桶中读取或写入出乎意料的文件.
删除时保留
默认情况下, 目的地桶的内容会 没有 当
BucketDeployment 资源从堆栈中移除,或当目的地是
换了 您可以使用选项 retainOnDelete: false 要禁用这种行为,
在这种情况下,内容将被删除.
假设这一点有以下几个含义:
-
逻辑标识更改
更改逻辑编号
BucketDeployment构造,不改变目的地 (例如由于重构,或有意改变ID) 将导致删除对象。 。 。 . 这是因为"云阵"将首先创建新的资源,不会影响, 之后删除旧资源,这将导致删除对象, 因为目的地没有改变retainOnDelete实值false。 。 。 . -
目标变化
当目标桶或前缀被更改时,上一个目标的所有文件都会 第一个 为: 删除后上传到新的目的地位置。 这可能涉及可用性 您的用户.
一般性建议
共享密钥
如果目标桶 没有 专为具体 BucketDeployment 构造(即由其他实体共享),
我们建议永远配置 destinationKeyPrefix 属性。 这将防止部署人员
不小心删除了它没有上传的数据.
专注的小桶
如果目标桶 实值 专门,跳过前缀配置可能是合理的,
在这种情况下,我们建议删除 retainOnDelete: false,转而配置
autoDeleteObjects
财产在目的地桶。 这将避免上述逻辑识别问题.
发泡
默认情况下, 来源中不存在的目标桶中的文件将被删除
当 BucketDeployment 创建或更新资源。 您可以使用选项 prune: false 无法禁用
,在这种情况下,文件将不会被删除.
declare const destinationBucket: s3.Bucket;
new s3deploy.BucketDeployment(this, 'DeployMeWithoutDeletingFilesOnDestination', {
sources: [s3deploy.Source.asset(path.join(__dirname, 'my-website'))],
destinationBucket,
prune: false,
});
此选项也允许您 同一目的桶前缀的多桶布置, 每一个都有各自的特性。 例如,您可以设置不同的缓存控制头 基于文件扩展名 :
declare const destinationBucket: s3.Bucket;
new s3deploy.BucketDeployment(this, 'BucketDeployment', {
sources: [s3deploy.Source.asset('./website', { exclude: ['index.html'] })],
destinationBucket,
cacheControl: [s3deploy.CacheControl.fromString('max-age=31536000,public,immutable')],
prune: false,
});
new s3deploy.BucketDeployment(this, 'HTMLBucketDeployment', {
sources: [s3deploy.Source.asset('./website', { exclude: ['*', '!index.html'] })],
destinationBucket,
cacheControl: [s3deploy.CacheControl.fromString('max-age=0,no-cache,no-store,must-revalidate')],
prune: false,
});
排除和包含过滤器
在部署中评价过滤器有两点:资产捆绑和实际部署。 如果您只是想在资产捆绑过程中排除文件, 您应该利用 exclude 财产 AssetOptions 定义源时:
declare const destinationBucket: s3.Bucket;
new s3deploy.BucketDeployment(this, 'HTMLBucketDeployment', {
sources: [s3deploy.Source.asset('./website', { exclude: ['*', '!index.html'] })],
destinationBucket,
});
如果您想要指定在部署过程中使用的过滤器, 您可以使用 exclude 财务报告和审定财务报表 include 打开过滤器 BucketDeployment。如果排除,这些文件将不会被部署到目的地桶。 此外,如果文件在目的桶中已经存在,如果您正在使用 prune 选项 :
declare const destinationBucket: s3.Bucket;
new s3deploy.BucketDeployment(this, 'DeployButExcludeSpecificFiles', {
sources: [s3deploy.Source.asset(path.join(__dirname, 'my-website'))],
destinationBucket,
exclude: ['*.txt'],
});
这些过滤器遵循的是AWS CLI所使用的相同格式. 详情见CLI文件 使用包含和排除过滤器。 。 。 .
对象元数据
您可以指定用于部署中所有对象的元数据.
S3中元数据有2个类型:系统自定义元数据和用户自定义元数据.
系统定义的元数据有一个特殊的目的,例如缓存控制定义了保存一个对象缓存的时间.
S3 不使用用户定义的元数据,密钥总是从 x-amz-meta- (此前缀会自动添加).
系统定义的元数据密钥包括以下内容:
- 缓存控制( e)
--cache-control内aws s3 sync(中文(简体) ) - 内容分散( e)
--content-disposition内aws s3 sync(中文(简体) ) - 内容编码( e)
--content-encoding内aws s3 sync(中文(简体) ) - 内容 - 语言
--content-language内aws s3 sync(中文(简体) ) - 内容类型( e)
--content-type内aws s3 sync(中文(简体) ) - 期满
--expires内aws s3 sync(中文(简体) ) - x- amz- 存储级( )
--storage-class内aws s3 sync(中文(简体) ) - x-amz-website-再定向定位(
--website-redirect内aws s3 sync(中文(简体) ) - x-amz- server- side- 加密 (
--sse内aws s3 sync(中文(简体) ) - x-amz-server-side-加密-aws-kms-key-id (英语:
--sse-kms-key-id内aws s3 sync(中文(简体) ) - x-amz-server-side-加密-客户-算法(
--sse-c-copy-source内aws s3 sync(中文(简体) ) - x- amz- acl (帮助
--acl内aws s3 sync(中文(简体) )
您可以在
S3 设置对象文档
财务报告和审定财务报表 aws s3 sync 文档。 。 。 .
const websiteBucket = new s3.Bucket(this, 'WebsiteBucket', {
websiteIndexDocument: 'index.html',
publicReadAccess: true,
});
new s3deploy.BucketDeployment(this, 'DeployWebsite', {
sources: [s3deploy.Source.asset('./website-dist')],
destinationBucket: websiteBucket,
destinationKeyPrefix: 'web/static', // optional prefix in destination bucket
metadata: { A: "1", b: "2" }, // user-defined metadata
// system-defined metadata
contentType: "text/html",
contentLanguage: "en",
storageClass: s3deploy.StorageClass.INTELLIGENT_TIERING,
serverSideEncryption: s3deploy.ServerSideEncryption.AES_256,
cacheControl: [
s3deploy.CacheControl.setPublic(),
s3deploy.CacheControl.maxAge(Duration.hours(1)),
],
accessControl: s3.BucketAccessControl.BUCKET_OWNER_FULL_CONTROL,
});
云纹无效
您可以提供 CloudFront 分发和可选路径, 以在桶部署完成后无效 .
import * as cloudfront from '@aws-cdk/aws-cloudfront';
import * as origins from '@aws-cdk/aws-cloudfront-origins';
const bucket = new s3.Bucket(this, 'Destination');
// Handles buckets whether or not they are configured for website hosting.
const distribution = new cloudfront.Distribution(this, 'Distribution', {
defaultBehavior: { origin: new origins.S3Origin(bucket) },
});
new s3deploy.BucketDeployment(this, 'DeployWithInvalidation', {
sources: [s3deploy.Source.asset('./website-dist')],
destinationBucket: bucket,
distribution,
distributionPaths: ['/images/*.png'],
});
大小限制
部署资源的默认内存限制为128MiB. 如果你需要的话
复制更大的文件,您可以使用 memoryLimit 用于增加
aWS Lambda 资源处理器大小.
部署资源的默认麻黄存储大小为512MiB. 狦
需要上传更大的文件,您可能达到此限制 。 你可以用这个
ephemeralStorageSize 用于增加 AWS Lambda 存储大小的配置
资源处理器.
注意: 您的堆栈中将新建 AWS Lambda 处理器, 用于每种组合 内存和存储大小.
EFS 支持
如果工作流程比默认的(512 MB)磁盘空间需要更多的磁盘空间,您可以附加一个 EFS 存储到下面
羊肉达功能. 启用 EFS 支持集 efs 财务报告和审定财务报表 vpc 巴克特部署的道具.
检查下方的样本使用情况 . 请注意,创建 VPC 内含可能导致堆栈删除失败. 为简洁起见,现将其列于下. 为了避免这种状况,您的网络在下方(VPC)保持单独堆放,并作为道具通过.
declare const destinationBucket: s3.Bucket;
declare const vpc: ec2.Vpc;
new s3deploy.BucketDeployment(this, 'DeployMeWithEfsStorage', {
sources: [s3deploy.Source.asset(path.join(__dirname, 'my-website'))],
destinationBucket,
destinationKeyPrefix: 'efs/',
useEfs: true,
vpc,
retainOnDelete: false,
});
有部署时间值的数据
内容转至 Source.data() 或者说 Source.jsonData() 可包含
只有在部署期间才能解决的参考文献.
例如:
import * as sns from '@aws-cdk/aws-sns';
declare const destinationBucket: s3.Bucket;
declare const topic: sns.Topic;
const appConfig = {
topic_arn: topic.topicArn,
base_url: 'https://my-endpoint',
};
new s3deploy.BucketDeployment(this, 'BucketDeployment', {
sources: [s3deploy.Source.jsonData('config.json', appConfig)],
destinationBucket,
});
数值在 topic.topicArn 是一个部署时间值。 只有解决
通过在生成的源文件中放置标记来进行部署,以及
以实际价值代替其部署到目的地.
页:1
- 此库使用一个 AWS CloudFormation 自定义资源, 大约是 10MiB in 尺寸。 此资源的代码与此库相捆绑 .
- AWS Lambda的执行时间限于15min. 这限制了数据的数量 它可以部署在桶 在这个暂停.
- 当
BucketDeployment从堆栈中取出,保留内容 在目的地桶内(952号) (中文(简体) ). - 使用时
s3deploy.Source.bucket()以获取文件源 另一桶: 只有在密钥( 文件名) 时才会更新已部署的文件 更改源桶中的文件。 正在更改文件不会到位 足够好: 如果属性不运行, 自定义资源将不会运行 变化.- 如果使用资产(
s3deploy.Source.asset()你不用担心 关于这一点:资产系统将确保如果文件有变化, 文件名称是独一无二的,部署将运行.
- 如果使用资产(
发展
自定义资源在 Python 3.7 中被执行,以便杠杆化
用于"aws s3同步"的 AWS CLI. 密码在下面 lib/lambda 财务报告和审定财务报表
单位测试正在进行中 test/lambda。 。 。 .
此软件包在构建时间需要 Python 3. 7 才能创建自定义 资源Lambda捆绑并测试. 还要靠几部剧本 所以 可能很难在Windows上发展.
路线图
- 支持“蓝色/绿色”部署(954号(中文(简体) )