amazon webbtjänster - CDK skapa resurs om den inte finns - typescript
Skapade en DynamoDB-tabell i mitt CDK-projekt. Det är okej, den används av lambdas som skapats i projektet. Vi behövde ta bort stacken vilket också är okej eftersom vi har behåll resurs inställd på true på tabellen.
Nu när jag försöker en ny distribution får vi felet 'tabell finns redan' och stacken rullar tillbaka. Jag behöver kod som bara skapar tabellen om den inte finns.
Här är grundläggande skapande av en tabell, jag kan inte hitta någon dokumentation någonstans om detta problem eller ens ett undantag som kan fångas eller där jag kan se typen av undantag som kastas för att fånga eftersom vi bara ser loggar i CloudFormation-konsolen på AWS-konsolen.
const dynamoTable = new Table(this, "my-table", {
tableName: StackConfiguration.tableName,
partitionKey: { name: "id", type: AttributeType.STRING },
});
Svar #1
Tyvärr kan du inte göra det i CDK, eftersom CDK genererar CloudFormation-mall vid kompileringstid, inte vid körtid. Jag ser flera alternativ här:
- Använd CloudFormation Resource Import för att importera en befintlig tabell till din stack
- Använd en anpassad resurs-lambda för att göra ett AWS API-anrop för att kontrollera om tabellen finns. Använd utdata från den anpassade resursen i
Fn.conditionEqualsi CDK-koden för att skapa tabellen villkorligt
Jag skulle rekommendera att välja det första alternativet om det är en engångsgrej du behöver göra, och alternativ 2 om du förväntar dig att detta händer regelbundet.
Svar #2
Från och med september 2023 tillåter CDK dig att importera befintliga resurser. Jag kunde följa dessa steg för att använda CDK för att importera min befintliga DynamoDB. Men när jag körde cdk import-kommandot klagade det på att mina Lambda-funktioner hade ändrats, även om cdk diff-kommandot rapporterade inga förändringar. Jag var tvungen att lägga till --force-alternativet till importkommandot.
Observera: Detta gjorde det inte möjligt för mig att göra det som @AnonymousAlias ursprungligen ville göra, vilket var att skapa resursen vid behov och hoppa över den annars. Jag tror att för att göra det skulle du behöva göra som @Tofig Hasanov föreslog, och först kontrollera om resursen existerar, och skapa den endast om den inte finns.
Från https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-import:
Importera befintliga resurser till en stack
Du kan använda kommandot cdk import för att föra resurser under CloudFormations hantering för en viss AWS CDK-stack. Detta är användbart om du migrerar till AWS CDK, eller om du flyttar resurser mellan stackar eller ändrar deras logiska id. cdk import använder CloudFormations resursimporter. Se listan över resurser som kan importeras här.
För att importera en befintlig resurs till en AWS CDK-stack, följ följande steg:
Se till att resurserna för närvarande inte hanteras av någon annan CloudFormation-stack. Om det gör det, ställ först in borttagningspolicyn till RemovalPolicy.RETAIN i den stack som resursen för närvarande befinner sig i och utför en distribution. Ta sedan bort resursen från stacken och utför ytterligare en distribution. Denna process säkerställer att resursen inte längre hanteras av CloudFormation men tar inte bort den.
Kör en cdk diff för att säkerställa att det inte finns några väntande ändringar i AWS CDK-stacken som du vill importera resurser till. De enda ändringar som tillåts i en "import"-operation är tillägget av nya resurser som du vill importera.
Lägg till konstruktioner för de resurser du vill importera till din stack. Till exempel, om du vill importera en Amazon S3-bucket, lägg till något som new s3.Bucket(this, 'ImportedS3Bucket', {});. Gör inga ändringar på någon annan resurs.
Du måste också försäkra dig om att exakt modellera det tillstånd som resursen för närvarande har i definitionen. För exemplet med hinken, se till att inkludera AWS KMS-nycklar, livscykelpolicyer och allt annat som är relevant för hinken. Om du inte gör det kan efterföljande uppdateringsoperationer inte göra vad du förväntar dig.
Du kan välja om du vill inkludera det fysiska hinknamnet eller inte. Vi rekommenderar vanligtvis att inte inkludera resursnamn i dina AWS CDK-resursdefinitioner så att det blir enklare att distribuera dina resurser flera gånger.
Kör cdk import STACKNAME.
Om resursnamnen inte finns i din modell kommer CLI att uppmana dig att ange de faktiska namnen på de resurser du importerar. Efter detta startar importen.
När cdk-import rapporterar framgång, hanteras resursen nu av AWS CDK och CloudFormation. Eventuella efterföljande ändringar du gör i resursens egenskaper i din AWS CDK-app kommer konstruktionskonfigurationen att tillämpas vid nästa distribution.
För att bekräfta att resursdefinitionen i din AWS CDK-app matchar det aktuella tillståndet för resursen, kan du starta en CloudFormation-övervakning av avvikelser.
Denna funktion stöder för närvarande inte import av resurser till nästlade stackar.