Disable/Enable Lambda SNS 以编程方式触发
Disable/Enable Lambda SNS Trigger Programmatically
我需要以编程方式禁用 lambda 的 SNS 触发器,但是,我似乎无法这样做。我希望它在 AWS Lambda 控制台中显示 "Disabled" 函数:
这是我试过的代码:
function updateEndpoints(endpoints, enable) {
const promises = [];
endpoints.forEach((endpoint) => {
console.log(`${enable ? 'Enabling' : 'Disabling'} Endpoint: ${endpoint}`);
promises.push(
SNS.setEndpointAttributes({
EndpointArn: endpoint,
Attributes: {
Enabled: enable ? 'True' : 'False',
},
}).promise()
.catch((e) => {
console.error(`Error ${enable ? 'Enabling' : 'Disabling'} Endpoint: ${endpoint}`);
console.error(e);
}));
});
return Promise.all(promises);
}
端点 ARN 已使用如下字符串正确传递(用正确的值代替下面的 <>):
-
arn:aws:lambda:<region>:<accountId>:function:<functionName>
-
对于我尝试启用或禁用的每个端点,这会从 AWS 产生一个错误:
-
InvalidParameter: Invalid parameter: EndpointArn Reason: Vendor lambda is not of SNS
-
是否无法通过 SNS 禁用 lambda 的 trigger/endpoint?一个人会怎么做呢?我宁愿不必 unsubscribe/subscribe 因为这会将订阅对象带出 CloudFormation 的范围(对吗?)。我查看了 updateEventSourceMappings,但是,根据文档,它仅适用于 DynamoDB 流、Kinesis Streams 和 SQS——不适用于 SNS。
似乎无法"disable" Lambda 订阅 SNS 主题。
我的推理基于我采取的以下步骤:
- 创建了一个 AWS Lambda 函数
- 创建了一个 Amazon SNS 主题
- 已将 Lambda 函数订阅到 SNS 主题(通过 SNS 控制台完成)
- 在Lambda控制台确认订阅SNS的函数为"enabled"
- 运行
aws sns list-subscriptions-by-topic --topic-arn arn:aws:sns:ap-southeast-2:123456789012:my-topic
- 看到 Lambda 函数已订阅
回复是:
{
"Subscriptions": [
{
"SubscriptionArn": "arn:aws:sns:ap-southeast-2:123456789012:stack:...",
"Owner": "123456789012",
"Protocol": "lambda",
"Endpoint": "arn:aws:lambda:ap-southeast-2:743112987576:function:my-function",
"TopicArn": "arn:aws:sns:ap-southeast-2:123456789012:stack"
}
]
}
然后我禁用了 Lambda 控制台中的触发器并保存了 Lambda 函数。当我重新运行上面的命令时,结果是空的:
{
"Subscriptions": []
}
当我再次启用时,订阅返回。
所以,我的假设是,由于 "disable/enable" 按钮实际上 添加和删除订阅 ,因此 似乎没有任何功能'disable' 订阅.
我找到了 (100%) 正确的方法来做到这一点。虽然可以使用@John Rotenstein 的答案,但不太正确,但应该仍然有效。
我发现当您点击切换按钮时,lambda 的策略实际上已更新:
已启用:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "my-lambda-1552674933742",
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:1234567890:function:my-lambda",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:sns:us-west-2:1234567890:my-lambda"
}
}
}
]
}
已禁用:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "my-lambda-1552674933742",
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": "lambda:DisableInvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:1234567890:function:my-lambda",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:sns:us-west-2:1234567890:my-lambda"
}
}
}
]
}
通知操作是lambda:InvokeFunction
与lambda:DisableInvokeFunction
。
我的流程如下:
- Lambda.listFunctions
- 对于每个函数,Lambda.removePermission
- 对于每个函数,Lambda.addPermission
备注:
- Lambda api 的默认安全限制为每个区域每个帐户 100 个并发执行。
- 您只能在 AddPermission 和 AddLayerVersionPermission API 操作范围内为 Lambda 资源更新基于资源的策略。您不能在 JSON 中为您的 Lambda 资源编写策略,也不能使用未映射到这些操作参数的条件。 See docs here
此外,您可以使用 Lambda.getPolicy 查看 lambda 的策略以确保它已更新。
我需要以编程方式禁用 lambda 的 SNS 触发器,但是,我似乎无法这样做。我希望它在 AWS Lambda 控制台中显示 "Disabled" 函数:
这是我试过的代码:
function updateEndpoints(endpoints, enable) {
const promises = [];
endpoints.forEach((endpoint) => {
console.log(`${enable ? 'Enabling' : 'Disabling'} Endpoint: ${endpoint}`);
promises.push(
SNS.setEndpointAttributes({
EndpointArn: endpoint,
Attributes: {
Enabled: enable ? 'True' : 'False',
},
}).promise()
.catch((e) => {
console.error(`Error ${enable ? 'Enabling' : 'Disabling'} Endpoint: ${endpoint}`);
console.error(e);
}));
});
return Promise.all(promises);
}
端点 ARN 已使用如下字符串正确传递(用正确的值代替下面的 <>):
-
arn:aws:lambda:<region>:<accountId>:function:<functionName>
-
对于我尝试启用或禁用的每个端点,这会从 AWS 产生一个错误:
-
InvalidParameter: Invalid parameter: EndpointArn Reason: Vendor lambda is not of SNS
-
是否无法通过 SNS 禁用 lambda 的 trigger/endpoint?一个人会怎么做呢?我宁愿不必 unsubscribe/subscribe 因为这会将订阅对象带出 CloudFormation 的范围(对吗?)。我查看了 updateEventSourceMappings,但是,根据文档,它仅适用于 DynamoDB 流、Kinesis Streams 和 SQS——不适用于 SNS。
似乎无法"disable" Lambda 订阅 SNS 主题。
我的推理基于我采取的以下步骤:
- 创建了一个 AWS Lambda 函数
- 创建了一个 Amazon SNS 主题
- 已将 Lambda 函数订阅到 SNS 主题(通过 SNS 控制台完成)
- 在Lambda控制台确认订阅SNS的函数为"enabled"
- 运行
aws sns list-subscriptions-by-topic --topic-arn arn:aws:sns:ap-southeast-2:123456789012:my-topic
- 看到 Lambda 函数已订阅
回复是:
{
"Subscriptions": [
{
"SubscriptionArn": "arn:aws:sns:ap-southeast-2:123456789012:stack:...",
"Owner": "123456789012",
"Protocol": "lambda",
"Endpoint": "arn:aws:lambda:ap-southeast-2:743112987576:function:my-function",
"TopicArn": "arn:aws:sns:ap-southeast-2:123456789012:stack"
}
]
}
然后我禁用了 Lambda 控制台中的触发器并保存了 Lambda 函数。当我重新运行上面的命令时,结果是空的:
{
"Subscriptions": []
}
当我再次启用时,订阅返回。
所以,我的假设是,由于 "disable/enable" 按钮实际上 添加和删除订阅 ,因此 似乎没有任何功能'disable' 订阅.
我找到了 (100%) 正确的方法来做到这一点。虽然可以使用@John Rotenstein 的答案,但不太正确,但应该仍然有效。
我发现当您点击切换按钮时,lambda 的策略实际上已更新:
已启用:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "my-lambda-1552674933742",
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:1234567890:function:my-lambda",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:sns:us-west-2:1234567890:my-lambda"
}
}
}
]
}
已禁用:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "my-lambda-1552674933742",
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": "lambda:DisableInvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:1234567890:function:my-lambda",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:sns:us-west-2:1234567890:my-lambda"
}
}
}
]
}
通知操作是lambda:InvokeFunction
与lambda:DisableInvokeFunction
。
我的流程如下: - Lambda.listFunctions - 对于每个函数,Lambda.removePermission - 对于每个函数,Lambda.addPermission
备注:
- Lambda api 的默认安全限制为每个区域每个帐户 100 个并发执行。
- 您只能在 AddPermission 和 AddLayerVersionPermission API 操作范围内为 Lambda 资源更新基于资源的策略。您不能在 JSON 中为您的 Lambda 资源编写策略,也不能使用未映射到这些操作参数的条件。 See docs here
此外,您可以使用 Lambda.getPolicy 查看 lambda 的策略以确保它已更新。