AWS 服务目录构建库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
AWS 服务目录 使各组织能够为其终端用户创建和管理经批准用于AWS的产品目录.
目录
这个 @aws-cdk/aws-servicecatalog 软件包包含使用户能够对其AWS资源进行大规模自动化治理和管理的资源.
import * as servicecatalog from '@aws-cdk/aws-servicecatalog';
组合
AWS Service Catalog 组合允许管理员为其终端用户组织,管理并分配云资源.
使用 CDK 可创建新组合 Portfolio 构造 :
new servicecatalog.Portfolio(this, 'Portfolio', {
displayName: 'MyPortfolio',
providerName: 'MyTeam',
});
也可以指定可选的元数据属性,例如 description 财务报告和审定财务报表 messageLanguage
帮助更好的目录和管理您的投资组合.
new servicecatalog.Portfolio(this, 'Portfolio', {
displayName: 'MyFirstPortfolio',
providerName: 'SCAdmin',
description: 'Portfolio for a project',
messageLanguage: servicecatalog.MessageLanguage.EN,
});
更多信息 创建和管理组合。 。 。 .
要在您的 CDK 应用程序中引用已有的组合, 请使用 Portfolio.fromPortfolioArn() 工厂方法:
const portfolio = servicecatalog.Portfolio.fromPortfolioArn(this, 'ReferencedPortfolio',
'arn:aws:catalog:region:account-id:portfolio/port-abcdefghi');
授权使用组合
您可以允许访问和管理 IAM (c) 用户、团体或角色可在组合内获得产品.
获准进入的实体将能够通过控制台或AWS CLI利用组合资源和产品.
一旦资源得到部署,终端用户将能够通过控制台或服务目录CLI访问.
import * as iam from '@aws-cdk/aws-iam';
declare const portfolio: servicecatalog.Portfolio;
const user = new iam.User(this, 'User');
portfolio.giveAccessToUser(user);
const role = new iam.Role(this, 'Role', {
assumedBy: new iam.AccountRootPrincipal(),
});
portfolio.giveAccessToRole(role);
const group = new iam.Group(this, 'Group');
portfolio.giveAccessToGroup(group);
与另一个 AWS 账户共享组合
您可以使用账户对账户共享方式,通过传递收件人账户号码,向其他 AWS 账户分配您投资组合的引用 . 股份启动后,受款人账户可以通过CLI或控制台通过导入组合ID来接受股份. 对共享投资组合所作的修改将自动向接受者传播.
declare const portfolio: servicecatalog.Portfolio;
portfolio.shareWithAccount('012345678901');
产品
产品是版本友好的基础设施-现码模板,管理为终端用户创建并添加到组合中,以提供并创建AWS资源.
服务目录支持来自AWS Marketplace或由CloudFormation模板定义的产品.
CDK目前只支持添加CloudFormation类型的产品.
使用 CDK 可以创建新产品 CloudFormationProduct 构造.
你用得着 CloudFormationTemplate.fromUrl 直接从 URL 从 CloudFormation 模板创建产品,该模板指向 S3, GitHub, 或代码承诺 :
const product = new servicecatalog.CloudFormationProduct(this, 'MyFirstProduct', {
productName: "My Product",
owner: "Product Owner",
productVersions: [
{
productVersionName: "v1",
cloudFormationTemplate: servicecatalog.CloudFormationTemplate.fromUrl(
'https://raw.githubusercontent.com/awslabs/aws-cloudformation-templates/master/aws/services/ServiceCatalog/Product.yaml'),
},
],
});
从本地资产创建产品
A 类 CloudFormationProduct 也可以通过使用本地存储在磁盘上的CloudFormation模板,使用"资产"来创建.
资产是部署前上传到S3 Bucket上的文件.
CloudFormationTemplate.fromAsset 可以通过将路径传递到磁盘上的本地模板文件来创建产品 :
import * as path from 'path';
const product = new servicecatalog.CloudFormationProduct(this, 'Product', {
productName: "My Product",
owner: "Product Owner",
productVersions: [
{
productVersionName: "v1",
cloudFormationTemplate: servicecatalog.CloudFormationTemplate.fromUrl(
'https://raw.githubusercontent.com/awslabs/aws-cloudformation-templates/master/aws/services/ServiceCatalog/Product.yaml'),
},
{
productVersionName: "v2",
cloudFormationTemplate: servicecatalog.CloudFormationTemplate.fromAsset(path.join(__dirname, 'development-environment.template.json')),
},
],
});
从堆栈创建产品
您可以创建服务目录 CloudFormationProduct 完全使用使用使用服务目录的 CDK 代码定义 ProductStack。 。 。 .
为你的产品创建了单独的子堆栈,你可以像其它CDK堆栈一样添加资源,
例如S3 Bucket、IAM角色和EC2实例。 此堆栈作为产品版本传递给您
产品。 这将不会在部署时创建一个单独的 CloudFormation 堆栈 .
import * as s3 from '@aws-cdk/aws-s3';
import * as cdk from '@aws-cdk/core';
class S3BucketProduct extends servicecatalog.ProductStack {
constructor(scope: cdk.Construct, id: string) {
super(scope, id);
new s3.Bucket(this, 'BucketProduct');
}
}
const product = new servicecatalog.CloudFormationProduct(this, 'Product', {
productName: "My Product",
owner: "Product Owner",
productVersions: [
{
productVersionName: "v1",
cloudFormationTemplate: servicecatalog.CloudFormationTemplate.fromProductStack(new S3BucketProduct(this, 'S3BucketProduct')),
},
],
});
从有以往版本历史的堆栈创建产品
Service Catalog的默认行为是在部署时覆盖每个产品版本. 这也适用于产品堆栈,在那里,只有您产品堆栈的最新变化会 部署. 为了在服务目录中提供修订产品集的历史, 您需要定义每个历史拷贝的产品Stack.
您可以创建 ProductStackHistory 以保持所有以前版本的快照.
这个 ProductStackHistory 可以通过传递基数创建 productStack, (中文(简体) ),
(单位:千美元) currentVersionName 您当前版本和 a locked 布尔.
这个 locked 布尔当设定为真时会阻止您 currentVersionName
从有该版本的快照时被覆盖.
import * as s3 from '@aws-cdk/aws-s3';
import * as cdk from '@aws-cdk/core';
class S3BucketProduct extends servicecatalog.ProductStack {
constructor(scope: cdk.Construct, id: string) {
super(scope, id);
new s3.Bucket(this, 'BucketProduct');
}
}
const productStackHistory = new servicecatalog.ProductStackHistory(this, 'ProductStackHistory', {
productStack: new S3BucketProduct(this, 'S3BucketProduct'),
currentVersionName: 'v1',
currentVersionLocked: true
});
我们可以部署当前版本 v1 通过使用 productStackHistory.currentVersion()
import * as s3 from '@aws-cdk/aws-s3';
import * as cdk from '@aws-cdk/core';
class S3BucketProduct extends servicecatalog.ProductStack {
constructor(scope: cdk.Construct, id: string) {
super(scope, id);
new s3.Bucket(this, 'BucketProductV2');
}
}
const productStackHistory = new servicecatalog.ProductStackHistory(this, 'ProductStackHistory', {
productStack: new S3BucketProduct(this, 'S3BucketProduct'),
currentVersionName: 'v2',
currentVersionLocked: true
});
const product = new servicecatalog.CloudFormationProduct(this, 'MyFirstProduct', {
productName: "My Product",
owner: "Product Owner",
productVersions: [
productStackHistory.currentVersion(),
],
});
使用 ProductStackHistory 所有已部署的产品Stack模板都将写入磁盘,
以便将来仍可提供,作为《公约》的定义 ProductStack 子类随时间变化.
这很重要 您将这些旧版本用于源控件作为这些版本
确定一个版本是否已经部署,也可以自行部署.
使用后 ProductStackHistory 用于部署版本 v1 您的电话 ProductStack我们
更改 ProductStack 并更新 currentVersionName 改为 v2。 。 。 .
我们还想要我们的 v1 版本仍待部署,所以我们通过调用 productStackHistory.versionFromSnapshot('v1')。 。 。 .
import * as s3 from '@aws-cdk/aws-s3';
import * as cdk from '@aws-cdk/core';
class S3BucketProduct extends servicecatalog.ProductStack {
constructor(scope: cdk.Construct, id: string) {
super(scope, id);
new s3.Bucket(this, 'BucketProductV2');
}
}
const productStackHistory = new servicecatalog.ProductStackHistory(this, 'ProductStackHistory', {
productStack: new S3BucketProduct(this, 'S3BucketProduct'),
currentVersionName: 'v2',
currentVersionLocked: true
});
const product = new servicecatalog.CloudFormationProduct(this, 'MyFirstProduct', {
productName: "My Product",
owner: "Product Owner",
productVersions: [
productStackHistory.currentVersion(),
productStackHistory.versionFromSnapshot('v1')
],
});
将产品添加到组合中
您将产品添加到组合中, 以便按规模组织和分发您的目录 。 将产品添加到组合中会形成一个协会, 并且产品将在服务目录控制台和AWS CLI的组合部分可见. 您可以在多个组合中添加一个产品,这取决于您的组织结构,以及您希望如何分组访问产品.
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
portfolio.addProduct(product);
标记选项
Tag Options允许管理员通过为终端用户选择的标签选择提供模板来方便地管理所提供产品的标签. 标签选项是通过指定带有一组允许值的标签密钥来创建的,可以同时与组合和产品相联. 在推出产品时,可以提供与产品相关的Tag options和包含的组合.
目前,Tag options只能在控制台被关闭.
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
const tagOptionsForPortfolio = new servicecatalog.TagOptions(this, 'OrgTagOptions', {
allowedValuesForTags: {
Group: ['finance', 'engineering', 'marketing', 'research'],
CostCenter: ['01', '02','03'],
},
});
portfolio.associateTagOptions(tagOptionsForPortfolio);
const tagOptionsForProduct = new servicecatalog.TagOptions(this, 'ProductTagOptions', {
allowedValuesForTags: {
Environment: ['dev', 'alpha', 'prod'],
},
});
product.associateTagOptions(tagOptionsForProduct);
制约因素
限制在于您对产品组合协会的治理姿态, 允许您管理最小的启动权限, 通知,以及终端用户可以对产品进行的其他可选行动. 使用 CDK, 如果您没有明确将一个产品与组合关联, 并添加一个约束, 它会自动为您添加一个关联 .
关于对投资组合产品协会如何适用限制,有一些规则.
例如,你只能有一个适用于组合-产品协会的单一"启动角色"约束.
如果添加了配置错误的制约, synth 将因错误消息而失败.
更多信息 服务目录限制。 。 。 .
标签更新限制
标签更新限制允许或不允许终端用户在提供时更新与AWS服务目录产品相关的资源标记. 默认情况下,如果不配置 Tag 更新限制,则不允许更新标签 . 如果允许标签更新,那么在提供产品更新期间,与产品或组合相关的新标签会被应用于提供的资源.
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
portfolio.addProduct(product);
portfolio.constrainTagUpdates(product);
如果您稍后想要禁用此特性, 您可以设置“ 允许” 参数至 false数字 :
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
// to disable tag updates:
portfolio.constrainTagUpdates(product, {
allow: false,
});
关于堆栈事件的通知
允许用户订阅 AWS SNS 主题到提供产品 Cloud Formation 堆栈事件.
当一个终端用户提供一个产品时,它会创建一个CloudFormation堆栈,在创建时通知订阅的话题,编辑并删除事件.
个人 SNS 专题可能只对任何特定组合产品协会进行单一订阅.
import * as sns from '@aws-cdk/aws-sns';
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
const topic1 = new sns.Topic(this, 'Topic1');
portfolio.notifyOnStackEvents(product, topic1);
const topic2 = new sns.Topic(this, 'Topic2');
portfolio.notifyOnStackEvents(product, topic2, {
description: 'description for topic2', // description is an optional field.
});
CloudFormation 模板参数约束
CloudFormation模板参数限制允许您配置终端用户在推出产品时可用的提供参数.
模板约束规则包括一种或多种断言,界定产品提供参数的默认值和/或允许值.
您可以配置多个参数约束来规范您产品中不同的提供参数.
例如,一项规则可以界定: EC2 实例类型,用户在启动包含一个或多个产品时可以选择 EC2 实例.
参数规则有可选 condition 字段允许规则应用考虑有条件的评价.
如果有的话 condition 如果条件评估为真实,则所有断言都将适用.
关于界定规则条件和主张的具体规则内在功能的信息,
见 AWS 规则函数。 。 。 .
import * as cdk from '@aws-cdk/core';
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
portfolio.constrainCloudFormationParameters(product, {
rule: {
ruleName: 'testInstanceType',
condition: cdk.Fn.conditionEquals(cdk.Fn.ref('Environment'), 'test'),
assertions: [{
assert: cdk.Fn.conditionContains(['t2.micro', 't2.small'], cdk.Fn.ref('InstanceType')),
description: 'For test environment, the instance type should be small',
}],
},
});
设定启动角色
允许您配置一个特定的 IAM 服务目录在推出产品时代表最终用户发挥的作用.
通过设定启动角色约束,可以在启动产品时对终端用户保持最小权限.
例如,启动角色可以授予特定资源创造权限,例如: S3 桶那个用户.
启动角色必须由服务目录负责人承担.
你只能有一个启动角色 组合产品协会,
您无法在已配置 StackSets 部署的产品上设定启动角色 .
import * as iam from '@aws-cdk/aws-iam';
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
const launchRole = new iam.Role(this, 'LaunchRole', {
assumedBy: new iam.ServicePrincipal('servicecatalog.amazonaws.com'),
});
portfolio.setLaunchRole(product, launchRole);
您也可以使用本地部署在终端用户账户中的角色名称设置启动角色 . 这对于角色和用户在CDK之外单独管理时有用. 规定的作用必须存在于造成启动作用制约的账户中, 以及希望提供具有启动作用的产品的任何最终用户账户.
您可以以明确设定的名称在角色中传递:
import * as iam from '@aws-cdk/aws-iam';
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
const launchRole = new iam.Role(this, 'LaunchRole', {
roleName: 'MyRole',
assumedBy: new iam.ServicePrincipal('servicecatalog.amazonaws.com'),
});
portfolio.setLocalLaunchRole(product, launchRole);
或者你可以简单地通过一个角色名称,CDK将创建一个角色,这个名字将信任账户中的服务目录:
import * as iam from '@aws-cdk/aws-iam';
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
const roleName = 'MyRole';
const launchRole: iam.IRole = portfolio.setLocalLaunchRoleName(product, roleName);
见 发射约束 文档 了解发射角色所需的权限.
随堆栈集部署
StackSets 部署限制允许您使用
AWS 云形堆栈设置。 。 。 .
您可以指定一个或多个账户和地区, 当产品被提供时, 堆栈实例将启动到其中 .
还有一个字段 allowStackSetInstanceOperations 设置终端用户创建、编辑或删除 StackSet所创建的堆栈的能力.
默认情况下,此字段设定为 false。 。 。 .
在启动 StackSets 产品时,终端用户可以从该约束中配置的账户列表和区域中选择,以确定 StackSentences 将部署在哪里以及部署顺序.
您只能定义每个组合产品关联的 StackSets 部署配置,
您无法同时设置启动角色和 StackSets 部署配置 .
import * as iam from '@aws-cdk/aws-iam';
declare const portfolio: servicecatalog.Portfolio;
declare const product: servicecatalog.CloudFormationProduct;
const adminRole = new iam.Role(this, 'AdminRole', {
assumedBy: new iam.AccountRootPrincipal(),
});
portfolio.deployWithStackSets(product, {
accounts: ['012345678901', '012345678902', '012345678903'],
regions: ['us-west-1', 'us-east-1', 'us-west-2', 'us-east-1'],
adminRole: adminRole,
executionRoleName: 'SCStackSetExecutionRole', // Name of role deployed in end users accounts.
allowStackSetInstanceOperations: true,
});