Многие ресурсы создаются вручную на нашей облачной платформе. Как эти ресурсы можно импортировать и управлять ими/обновлять через cdk? Обновлением ресурсов AWS могут быть теги, статус и т. д.
Я нашел несколько примеров, но развертывание каждого ресурса с использованием упомянутых шагов может занять много времени.
Чтобы начать миграцию, я начал с ключей KMS и обнаружил, что есть метод fromKeyArn
, который возвращает все сведения о ключе KMS, но не уверен, как его можно использовать в качестве шаблона и снова развернуть. Пример кода и вывод kmsKey приведены ниже.
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Tags, RemovalPolicy } from 'aws-cdk-lib';
import { Key } from 'aws-cdk-lib/aws-kms'
export class CoreAwsInfraStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
Tags.of(this).add('Environment', 'Production');
Tags.of(this).add('Project', 'MyProject');
const kmsKeyArn = 'arn:aws:kms:<region>:<account>:key/<kmskeyid>';
const kmsKey = Key.fromKeyArn(this, 'ImportedKmsKey', kmsKeyArn);
console.info("here is kms key",kmsKey)
}
}
<ref *1> Import {
node: Node {
host: [Circular *1],
_locked: false,
_children: {},
_context: {},
_metadata: [],
_dependencies: Set(0) {},
_validations: [ [Object] ],
id: 'ImportedKmsKey',
scope: CoreAwsInfraStack {
node: [Node],
_missingContext: [],
_stackDependencies: {},
templateOptions: {},
_crossRegionReferences: false,
_suppressTemplateIndentation: false,
_logicalIds: [LogicalIDs],
account: '52xxxxxx',
region: 'ap-southeast-2',
environment: 'aws://526129xxx/ap-souxxxxx',
_terminationProtection: false,
_stackName: 'CoreAwsInfraStack',
tags: [TagManager],
artifactId: 'CoreAwsInfraStack',
templateFile: 'CoreAwsInfraStack.template.json',
_versionReportingEnabled: true,
synthesizer: [DefaultStackSynthesizer],
[Symbol(@aws-cdk/core.DependableTrait)]: [Object]
}
},
stack: <ref *2> CoreAwsInfraStack {
node: Node {
host: [Circular *2],
_locked: false,
_children: [Object],
_context: {},
_metadata: [],
_dependencies: Set(0) {},
_validations: [],
id: 'CoreAwsInfraStack',
scope: [App]
},
_missingContext: [],
_stackDependencies: {},
templateOptions: {},
_crossRegionReferences: false,
_suppressTemplateIndentation: false,
_logicalIds: LogicalIDs { renames: {}, reverse: {} },
account: '52xxxxxx',
region: 'ap-southeast-2',
environment: 'aws://xxxxxx/ap-soxxxxx',
_terminationProtection: false,
_stackName: 'CoreAwsInfraStack',
tags: TagManager {
tags: Map(0) {},
priorities: Map(0) {},
externalTagPriority: 50,
resourceTypeName: 'aws:cdk:stack',
tagFormatter: KeyValueFormatter {},
tagPropertyName: 'tags',
didHaveInitialTags: false,
renderedTags: [LazyAny]
},
artifactId: 'CoreAwsInfraStack',
templateFile: 'CoreAwsInfraStack.template.json',
_versionReportingEnabled: true,
synthesizer: DefaultStackSynthesizer {
_boundStack: [Circular *2],
qualifier: 'hnb659fds',
bucketName: 'xxxxx',
repositoryName: 'xxxxxx',
_deployRoleArn: 'arn:${AWS::Partition}:iam::xxx:role/cdk-hnb659fds-deploy-role-xxx-ap-souxxx',
_cloudFormationExecutionRoleArn: 'arn:${AWS::Partition}:iam::xxxx:role/cdk-hnb659fds-cfn-exec-role-xxx-ap-southeast-2',
fileAssetPublishingRoleArn: 'arn:${AWS::Partition}:iam::xxx:role/cdk-hnb659fds-file-publishing-role-xxxx-ap-xxx',
imageAssetPublishingRoleArn: 'arn:${AWS::Partition}:iam::xxxx:role/cdk-hnb659fds-image-publishing-role-xxxxx-ap-southeast-2',
lookupRoleArn: 'arn:${AWS::Partition}:iam::xxxx:role/cdk-hnb659fds-lookup-role-xxx-ap-soutxxx',
bucketPrefix: '',
dockerTagPrefix: '',
bootstrapStackVersionSsmParameter: '/cdk-bootstrap/hnb659fds/version'
},
[Symbol(@aws-cdk/core.DependableTrait)]: { dependencyRoots: [Array] }
},
env: { account: 'xxxx', region: 'ap-sxxx' },
_physicalName: undefined,
_allowCrossEnvironment: false,
physicalName: '${Token[TOKEN.9]}',
aliases: [],
keyArn: 'arn:aws:kms:ap-soxxx:xxx:key/a00xxxxxxx',
policy: undefined,
trustAccountIdentities: true,
keyId: 'a00d1xxxx',
[Symbol(@aws-cdk/core.DependableTrait)]: { dependencyRoots: [ [Circular *1] ] }
}
Для этого нельзя использовать fromKeyArn
.
Вы используете такие функции, как fromKeyArn
, когда хотите указать существующий ключ в качестве свойства для другого ресурса в вашем стеке, например корзины, которую вы зашифруете с помощью ключа. fromKeyArn
не приводит к тому, что ключ, на который вы ссылаетесь, управляется вашим стеком CDK.
Когда вы говорите, что развертывание каждого ресурса с помощью шагов, описанных в этом посте, займет много времени, я предполагаю, что вы имеете в виду, что определение правильного CDK для всех ресурсов, которые вы хотите импортировать, займет много времени, но это не так. запускайте команду cdk import
для одного ресурса за раз.
Согласно документации , вы сможете импортировать несколько ресурсов с помощью одной cdk import
команды.
Но сначала вам нужно написать CDK для существующих ресурсов.
Чтобы сократить время написания вручную кода CDK для ресурсов, которые вы хотите импортировать, вы можете использовать Генератор IaC , который должен генерировать CloudFormation из развернутых ресурсов, и CDK Migrate.
Я не уверен, что CDK Migrate добавит ресурсы в существующий стек CDK. Если нет, вы можете использовать его для создания кода для нового приложения CDK, а затем скопировать оттуда ресурсы в существующее приложение CDK.