AWS 代码部署构造库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
AWS 代码Depplus是一个部署服务,将应用程序部署自动化到 Amazon EC2 实例, 默认实例, 无服务器的 Lambda 函数, 或 亚马逊ECS服务.
CDK目前支持Amazon EC2, on-premise和AWS Lambda应用.
EC2/关于前提的应用程序
创建一个新的代码部署应用程序,用于EC2/promise实例:
const application = new codedeploy.ServerApplication(this, 'CodeDeployApplication', {
applicationName: 'MyApplication', // optional property
});
要导入已有的应用程序 :
const application = codedeploy.ServerApplication.fromServerApplicationName(
this,
'ExistingCodeDeployApplication',
'MyExistingApplication',
);
EC2/现场部署小组
设立一个新的代号部署小组,部署在EC2/promise实例中:
import * as autoscaling from '@aws-cdk/aws-autoscaling';
import * as cloudwatch from '@aws-cdk/aws-cloudwatch';
declare const application: codedeploy.ServerApplication;
declare const asg: autoscaling.AutoScalingGroup;
declare const alarm: cloudwatch.Alarm;
const deploymentGroup = new codedeploy.ServerDeploymentGroup(this, 'CodeDeployDeploymentGroup', {
application,
deploymentGroupName: 'MyDeploymentGroup',
autoScalingGroups: [asg],
// adds User Data that installs the CodeDeploy agent on your auto-scaling groups hosts
// default: true
installAgent: true,
// adds EC2 instances matching tags
ec2InstanceTags: new codedeploy.InstanceTagSet(
{
// any instance with tags satisfying
// key1=v1 or key1=v2 or key2 (any value) or value v3 (any key)
// will match this group
'key1': ['v1', 'v2'],
'key2': [],
'': ['v3'],
},
),
// adds on-premise instances matching tags
onPremiseInstanceTags: new codedeploy.InstanceTagSet(
// only instances with tags (key1=v1 or key1=v2) AND key2=v3 will match this set
{
'key1': ['v1', 'v2'],
},
{
'key2': ['v3'],
},
),
// CloudWatch alarms
alarms: [alarm],
// whether to ignore failure to fetch the status of alarms from CloudWatch
// default: false
ignorePollAlarmsFailure: false,
// auto-rollback configuration
autoRollback: {
failedDeployment: true, // default: true
stoppedDeployment: true, // default: false
deploymentInAlarm: true, // default: true if you provided any alarms, false otherwise
},
});
所有属性都是可选的 - 如果你不提供应用程序, 将自动创建.
要导入已有的部署小组:
declare const application: codedeploy.ServerApplication;
const deploymentGroup = codedeploy.ServerDeploymentGroup.fromServerDeploymentGroupAttributes(
this,
'ExistingCodeDeployDeploymentGroup', {
application,
deploymentGroupName: 'MyExistingDeploymentGroup',
},
);
装入平衡器
你们可以 指定负载平衡器
与 loadBalancer 创建部署小组时的属性.
LoadBalancer 是一个抽象的类,带有静态的工厂方法, 允许您从各种来源创建实例.
用经典弹性负载平衡器直接提供:
import * as elb from '@aws-cdk/aws-elasticloadbalancing';
declare const lb: elb.LoadBalancer;
lb.addListener({
externalPort: 80,
});
const deploymentGroup = new codedeploy.ServerDeploymentGroup(this, 'DeploymentGroup', {
loadBalancer: codedeploy.LoadBalancer.classic(lb),
});
有应用程序负载平衡器或网络负载平衡器, 您提供了一个目标组作为负载平衡器:
import * as elbv2 from '@aws-cdk/aws-elasticloadbalancingv2';
declare const alb: elbv2.ApplicationLoadBalancer;
const listener = alb.addListener('Listener', { port: 80 });
const targetGroup = listener.addTargets('Fleet', { port: 80 });
const deploymentGroup = new codedeploy.ServerDeploymentGroup(this, 'DeploymentGroup', {
loadBalancer: codedeploy.LoadBalancer.application(targetGroup),
});
部署配置
您也可以在创建部署小组时通过部署配置 :
const deploymentGroup = new codedeploy.ServerDeploymentGroup(this, 'CodeDeployDeploymentGroup', {
deploymentConfig: codedeploy.ServerDeploymentConfig.ALL_AT_ONCE,
});
默认部署配置为 ServerDeploymentConfig.ONE_AT_A_TIME。 。 。 .
您也可以创建自定义部署配置 :
const deploymentConfig = new codedeploy.ServerDeploymentConfig(this, 'DeploymentConfiguration', {
deploymentConfigName: 'MyDeploymentConfiguration', // optional property
// one of these is required, but both cannot be specified at the same time
minimumHealthyHosts: codedeploy.MinimumHealthyHosts.count(2),
// minimumHealthyHosts: codedeploy.MinimumHealthyHosts.percentage(75),
});
或导入已有的 :
const deploymentConfig = codedeploy.ServerDeploymentConfig.fromServerDeploymentConfigName(
this,
'ExistingDeploymentConfiguration',
'MyExistingDeploymentConfiguration',
);
Lambda 应用程序
要创建用于 Lambda 函数的新代码部署应用程序:
const application = new codedeploy.LambdaApplication(this, 'CodeDeployApplication', {
applicationName: 'MyApplication', // optional property
});
要导入已有的应用程序 :
const application = codedeploy.LambdaApplication.fromLambdaApplicationName(
this,
'ExistingCodeDeployApplication',
'MyExistingApplication',
);
Lambda 部署小组
为了实现Lambda函数的流量转移部署,CodeDplus使用Lambda Alitaases,可以平衡您函数的两个不同版本的流量. 在部署前,别名会100%地向生产中使用的版本发送引用. 当您向您的堆栈发布新版本的功能时, CodeDploy将会向新版本发送一小部分流量,监控,并在将100%的流量转移到新版本之前进行验证.
为建立一个新的代号部署部署小组,部署在Lambda职能中:
declare const myApplication: codedeploy.LambdaApplication;
declare const func: lambda.Function;
const version = func.currentVersion;
const version1Alias = new lambda.Alias(this, 'alias', {
aliasName: 'prod',
version,
});
const deploymentGroup = new codedeploy.LambdaDeploymentGroup(this, 'BlueGreenDeployment', {
application: myApplication, // optional property: one will be created for you if not provided
alias: version1Alias,
deploymentConfig: codedeploy.LambdaDeploymentConfig.LINEAR_10PERCENT_EVERY_1MINUTE,
});
为了部署这个功能的新版本:
- 以最新的更改引用版本
const version = func.currentVersion。 。 。 . - 重新部署堆栈( 这将触发部署) .
- 监控代码部署,作为版本之间的流量转移.
创建自定义部署配置
Lambda的代码部署带有内置的换乘配置. 如果你想说明自己的策略, 您可以使用自定义LambdaD部署配置构建, 请精确指定新功能版本的部署速度 .
const config = new codedeploy.CustomLambdaDeploymentConfig(this, 'CustomConfig', {
type: codedeploy.CustomLambdaDeploymentConfigType.CANARY,
interval: Duration.minutes(1),
percentage: 5,
});
declare const application: codedeploy.LambdaApplication;
declare const alias: lambda.Alias;
const deploymentGroup = new codedeploy.LambdaDeploymentGroup(this, 'BlueGreenDeployment', {
application,
alias,
deploymentConfig: config,
});
您可以为您的部署配置指定自定义名称, 但如果您这样做, 您将无法通过 CDK 更新间隔/ 百分比 .
const config = new codedeploy.CustomLambdaDeploymentConfig(this, 'CustomConfig', {
type: codedeploy.CustomLambdaDeploymentConfigType.CANARY,
interval: Duration.minutes(1),
percentage: 5,
deploymentConfigName: 'MyDeploymentConfig',
});
回滚和警报
如果部署失败 代码部署会退后 当一个或多个提醒处于失败状态时, 您可以选择触发回滚 :
import * as cloudwatch from '@aws-cdk/aws-cloudwatch';
declare const alias: lambda.Alias;
const alarm = new cloudwatch.Alarm(this, 'Errors', {
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 1,
evaluationPeriods: 1,
metric: alias.metricErrors(),
});
const deploymentGroup = new codedeploy.LambdaDeploymentGroup(this, 'BlueGreenDeployment', {
alias,
deploymentConfig: codedeploy.LambdaDeploymentConfig.LINEAR_10PERCENT_EVERY_1MINUTE,
alarms: [
// pass some alarms when constructing the deployment group
alarm,
],
});
// or add alarms to an existing group
declare const blueGreenAlias: lambda.Alias;
deploymentGroup.addAlarm(new cloudwatch.Alarm(this, 'BlueGreenErrors', {
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 1,
evaluationPeriods: 1,
metric: blueGreenAlias.metricErrors(),
}));
钩子和后钩
CodeDeplocation允许您在交通转会实际开始前(PreTraffic Hook)和完成后(后Traffic Hook)运行任意的Lambda函数. 使用任意一钩,您有机会运行逻辑来决定部署是否必须成功或失败. 例如,用PreTraffic钩子,你可以对新创建的Lambda版本进行集成测试(但不服务流量). 有了后Traffic钩,你可以运行端到端验证检查.
declare const warmUpUserCache: lambda.Function;
declare const endToEndValidation: lambda.Function;
declare const alias: lambda.Alias;
// pass a hook whe creating the deployment group
const deploymentGroup = new codedeploy.LambdaDeploymentGroup(this, 'BlueGreenDeployment', {
alias: alias,
deploymentConfig: codedeploy.LambdaDeploymentConfig.LINEAR_10PERCENT_EVERY_1MINUTE,
preHook: warmUpUserCache,
});
// or configure one on an existing deployment group
deploymentGroup.addPostHook(endToEndValidation);
导入现有的部署小组
要导入已有的部署小组:
declare const application: codedeploy.LambdaApplication;
const deploymentGroup = codedeploy.LambdaDeploymentGroup.fromLambdaDeploymentGroupAttributes(this, 'ExistingCodeDeployDeploymentGroup', {
application,
deploymentGroupName: 'MyExistingDeploymentGroup',
});