在 AWS CDK 中使用 AWS SDK 的正确方法

Car*_*ght 7 javascript amazon-web-services typescript aws-sdk-js aws-cdk

我正在尝试在我的 CDK 应用程序中使用 SDK。我的堆栈正在创建一个目录、一些网络内容,然后是一些使用需要 AD DNS IP 的 PowerShell 脚本加入域的实例,我目前使用它的方式如下:

const ds = new DirectoryService();

const result = new Promise(function (resolve: (value: string) => any, reject) {
        ds.describeDirectories({}, function (err, data) {
            if (err){
            reject(data)
        }else{
            try{
                if (data.DirectoryDescriptions){
                    if (data.DirectoryDescriptions[0].DnsIpAddrs){
                        resolve(data.DirectoryDescriptions[0].DnsIpAddrs.toString())
                    }
                }
            }catch (e) {
                reject("Directory doesn't exist yet.")
            }
        }
    })
});
result.then(value => {
    const subs = {
        "#{DNS_ADDRESSES}": value,
        "#{SECRET_ID}": directory.directorySecret.secretArn
    };

    Object.entries(subs).forEach(
        ([key, value]) => {
            domainJoinScript = domainJoinScript.replace(key, String(value));
        }
    );

    new  Stack(app, 'instances', networking.vpc, domainJoinScript);

}).catch(error => {
    print(error)
});
Run Code Online (Sandbox Code Playgroud)

现在这可行了,但它远非一个干净的解决方案。我的新堆栈中有多个资源,这意味着我必须通过多个级别传递 SDK 调用的结果,而不是直接在需要的地方传递,如果我必须进行多个 SDK 调用,这会变得更加混乱。

核心问题是 AWS SDK 在 JS 中是完全异步的,这意味着我必须使用上面相当详细的模式来包装它。

有没有人有更好的方法来做到这一点?

Con*_*ole 3

您可以使用AwsCustomResource实施 AWS 开发工具包调用

这允许在不同的资源操作(oncreate、ondelete、onupdate)上调用 AWS 开发工具包函数

结果数据可以通过调用getData来消费。这确实进一步允许 cdk 创建的 CloudFormation 模板无需客户端运行即可工作。

我使用它的一个示例如下:

const userPoolDomainDescription = new customResources.AwsCustomResource(this, 'user-pool-domain-description', {
  onCreate: {
    physicalResourceId: 'user-pool-domain-description',
    service: 'CognitoIdentityServiceProvider',
    action: 'describeUserPoolDomain',
    parameters: {
      Domain: userPoolDomain.domain
    }
  }
});

const dnsName = userPoolDomainDescription.getData('DomainDescription.CloudFrontDistribution').toString();
Run Code Online (Sandbox Code Playgroud)