簡體   English   中英

AWS - CloudFormation 返回堆棧已存在異常並且未能更新到 DynamoDB,盡管堆棧已成功創建

[英]AWS - CloudFormation returned stack-already-exists exception and failed to update to DynamoDB though stack was successfully created

我想使用 AWS SDK 創建我的子堆棧(在我的主堆棧旁邊),並將創建的堆棧 ID 寫入 DynamoDB。 問題是雖然堆棧創建成功,但 lambda 返回AlreadyExistsException ,因此無法將堆棧 id 更新為 DB。 奇怪的是,如果我在更新 DB function 之前刪除了await ,則 lambda 返回成功,但更新 function 不會繼續。 創建子堆棧 lambda function 在我的主堆棧創建完成后調用,其狀態可以從 SNS 檢索。

我能做些什么來實現我的目標?

我的代碼如下所示:

public async createMyStack(dataId) {
    let stackId = '';

    let data = this.dbService.getData(dataId);

    if (!data.StackId) {
        const cfn = new AWS.CloudFormation({
            region: 'us-east-1'
        });

        let stackInput: AWS.CloudFormation.Types.CreateStackInput = [
            // Some stack input here
        ];

        // create the stack
        await cfn.createStack(stackInput, (err, data) => {
            if (err) {
                console.error(err);
                throw err;
            }
        
            stackId = data.StackId ?? '';
        }).promise();

        // write stack id to DB
        if (stackId) {
            try {
                await this.dbService.update('StackId', stackId);
            } catch (error) {
                console.error(error);
                throw error;
            }
        }
    }

    return stackId;
}

createStack同時使用 promise 和回調,因此該操作執行了兩次。 使用 promise 或回調(不是兩者)都可以解決問題。

// create the stack
cfn.createStack(stackInput, (err, data) => {
    if (err) {
        console.error(err);
        throw err;
    }
        
    stackId = data.StackId ?? '';
});

或者

// create the stack
try {
    await cfn.createStack(stackInput).promise();
    stackId = data.StackId ?? '';
} catch (error) {
    console.error(error);
    throw error;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM