Próbuję użyć zestawu SDK w mojej aplikacji CDK. Mój stos tworzy katalog, pewne rzeczy sieciowe, a następnie kilka instancji, które dołącza do domeny za pomocą skryptu PowerShell, który wymaga adresów IP AD DNS, obecnie używam go w następujący sposób:

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)
});

Teraz to działa, ale daleko mu do czystego rozwiązania. Mój nowy stos zawiera wiele zasobów, co oznacza, że muszę przekazać wynik wywołania SDK przez kilka poziomów, a nie tylko bezpośrednio tam, gdzie jest to potrzebne, a gdybym musiał wykonać wiele wywołań SDK, stałoby się jeszcze bardziej bałagan.

Podstawowym problemem jest to, że AWS SDK jest czysto asynchroniczny w JS, co oznacza, że muszę użyć dość rozwlekłego wzorca powyżej, aby go opakować.

Czy ktoś ma lepszy sposób, aby to zrobić?

5
Carling Knight 19 grudzień 2019, 12:42

1 odpowiedź

Możesz zaimplementować wywołania AWS SDK przy użyciu AwsCustomResource

Pozwala to na wywoływanie funkcji AWS SDK na różnych akcjach zasobów (oncreate, ondelete, onupdate)

Dane wynikowe można wykorzystać, wywołując getData. Pozwala to ponadto na pracę utworzonego przez cdk szablonu CloudFormation bez klienta, który mógłby go uruchomić.

Jeden przykład, w którym użyłem tego, jest następujący:

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();
2
quadroid 7 styczeń 2020, 17:43
Const exportedCoreStackData = new AwsCustomResource(stack, ‘exported-dta’, { onCreate: { PhysicalResourceId: ‘exported-dta’, service: ‘CloudFormation’, action: ‘listExports’, parameters: { } } }); ale to nie powiedzie się, mówiąc, że nie ma takiego klucza „Eksporty” exportedCoreStackData.getData(„Eksporty”)
 – 
Purna
17 marzec 2020, 14:43
Jeśli uruchomisz kod w wierszu poleceń, otrzymasz tablicę? Czy jest pusty? AWS cloudformation list-exports. Powinieneś chyba zadać to we własnym pytaniu :)
 – 
quadroid
17 marzec 2020, 16:59