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ć?
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();