簡體   English   中英

如何使用 AWS CDK 將現有 Lambda 函數的別名指定為 DynamoDB 觸發器?

[英]How do I specify an existing Lambda function's alias as a DynamoDB trigger using the AWS CDK?

我正在嘗試使用 CDK 為 DynamoDB 表設置觸發器,其中 lambda 及其別名已在不同的堆棧中創建。

我想將特定的 Lambda 別名關聯到 DynamoDB 表作為其觸發器。

到目前為止,我有這個代碼,它對於 Lambda 的$LATEST版本工作得非常好:

const lambdaArn = `arn:aws:lambda:${stack.region}:${stack.account}:function:SOME_LAMBDA`;
const lamdba = Function.fromFunctionArn(stack, "lambda", lambdaArn);

lamdba.addEventSource(new DynamoEventSource(table, {
    startingPosition: StartingPosition.LATEST,
}));

我如何才能根據名稱指定特定的別名?


[更新]

在我看來,我需要做這樣的事情:

const lambdaArn = `arn:aws:lambda:${stack.region}:${stack.account}:function:SOME_LAMBDA`;
const lamdba = Function.fromFunctionArn(stack, "lambda", lambdaArn);

const version = Version.fromVersionAttributes(stack, "version", {
    lambda: lamdba,
    version: ???,//Supposedly a string
});

const alias = Alias.fromAliasAttributes(stack, "alias", {
    aliasName: "SOME_ALIAS",
    aliasVersion: version,
});

alias.addEventSource(new DynamoEventSource(table, {
    startingPosition: StartingPosition.LATEST,
}));

但是這段代碼的問題是我不知道如何在CDK中找到別名的版本!


[更新]

也許是我的錯,沒有提到我嘗試過和失敗的所有不同方式。 但在任何情況下,僅將別名添加到 ARN 的末尾並使用Function.fromFunctionArn都無濟於事。 這就是我的意思:

const lambdaArn = `arn:aws:lambda:${stack.region}:${stack.account}:function:SOME_LAMBDA:SOME_ALIAS`;
const lamdba = Function.fromFunctionArn(stack, "lambda", lambdaArn);

lamdba.addEventSource(new DynamoEventSource(table, {
    startingPosition: StartingPosition.LATEST,
}));

上面的代碼就像沒有SOME_ALIAS代碼一樣。 這是我第一次嘗試解決這個問題。 它不起作用的原因是返回的IFunction中沒有別名的概念。 那是因為IFunction沒有這樣的功能。

最后的代碼將導致使用 lambda 的$LATEST版本。 換句話說,我需要一個IAlias實例才能工作,而不是一個IFunction實例。

您的第一個代碼幾乎是正確的 - 要導入版本,請使用其 ARN:

const lambdaArn = `arn:aws:lambda:${stack.region}:${stack.account}:function:SOME_LAMBDA`;
const lamdba = Function.fromFunctionArn(stack, "lambda", lambdaArn);

const versionArn = `arn:aws:lambda:${stack.region}:${stack.account}:function:SOME_LAMBDA:VERSION_NAME`;

const version = Version.fromVersionArn(stack, "version", versionArn);

const alias = Alias.fromAliasAttributes(stack, "alias", {
    aliasName: "SOME_ALIAS",
    aliasVersion: version,
});

您在創建別名時指定了版本名稱。

您缺少 1 個要點 - 每個別名都有一個唯一的 ARN

Function.fromFunctionArn接受 3 個參數,最后一個是 Lambda 函數 ARN。

您可以使用以下 ARN 格式導入所需的任何 Lambda 別名:

arn:aws:lambda:${REGION}:${ACCOUNT}:function:${FUNCTION_NAME}:${ALIAS_NAME}

例如,如果您的函數 ARN 是:

arn:aws:lambda:eu-west-1:585470346692:function:MyFunction

名為Alias1的 Lambda 別名的 ARN 將是:

arn:aws:lambda:eu-west-1:585470346692:function:MyFunction:Alias1

通過使用別名 ARN 導入 Lambda 函數的別名,然后將事件源添加到導入的別名,將事件源設置為 Lambda 別名。

這將起作用:

const lambdaArn = `arn:aws:lambda:${stack.region}:${stack.account}:function:SOME_LAMBDA`;

const aliasName = "SOME_ALIAS";
const aliasArn = lambdaArn + ":" + aliasName;

const lambdaAlias = Function.fromFunctionArn(stack, "lambda", aliasArn);

lambdaAlias.addEventSource(new DynamoEventSource(table, {
    startingPosition: StartingPosition.LATEST,
}));

暫無
暫無

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

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