【问题标题】:Correct way to use AWS SDK within AWS CDK在 AWS CDK 中使用 AWS 开发工具包的正确方法
【发布时间】:2020-01-07 22:43:43
【问题描述】:

我正在尝试在我的 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)
});

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

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

有人有更好的方法吗?

【问题讨论】:

    标签: javascript typescript amazon-web-services aws-cdk aws-sdk-js


    【解决方案1】:

    您可以使用 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();
    

    【讨论】:

    • const exportsCoreStackData = new AwsCustomResource(stack, 'exported-dta', { onCreate: { physicalResourceId: 'exported-dta', service: 'CloudFormation', action: 'listExports', 参数: { } } });但这没有说没有这样的关键'Exports'exportedCoreStackData.getData('Exports')
    • @Purna 如果您在命令行上运行代码,您会得到一个数组吗?还是它是空的? aws cloudformation 列表导出。您可能应该在自己的问题中提出这个问题:)
    猜你喜欢
    • 2020-07-30
    • 2021-10-29
    • 2022-01-02
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多