以编程方式禁用/启用 Lambda SNS 触发器

2024-01-07

我需要以编程方式禁用 lambda 的 SNS 触发器,但是,我似乎无法这样做。我希望该函数在 AWS Lambda 控制台中显示“已禁用”:

这是我尝试过的代码:

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 的触发器/端点?人们会如何去做这件事呢?我不想取消订阅/订阅,因为这会使订阅对象超出 CloudFormation 的范围(正确吗?)。我查看了 updateEventSourceMappings,但是根据文档,它仅适用于 DynamoDB 流、Kinesis Streams 和 SQS,不适用于 SNS。


我找到了(100%)正确的方法来做到这一点。虽然可以使用@John Rotenstein 的答案,但它不太正确,但应该仍然有效。

我发现当您单击切换按钮时,lambda 的策略实际上已更新:

Enabled:

{
  "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"
        }
      }
    }
  ]
}

Notice Action is lambda:InvokeFunction vs. lambda:DisableInvokeFunction.

我这样做的过程如下: - Lambda.listFunctions - 对于每个函数,Lambda.removePermission - 对于每个函数,Lambda.addPermission

Notes:

  • Lambda api 的默认安全限制为每个区域每个账户 100 个并发执行。
  • 您只能在 AddPermission 和 AddLayerVersionPermission API 操作范围内更新 Lambda 资源的基于资源的策略。您无法以 JSON 格式为 Lambda 资源编写策略,也无法使用不映射到这些操作的参数的条件。请参阅此处的文档 https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html

此外,您还可以使用 Lambda.getPolicy 查看 lambda 的策略以确保其已更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式禁用/启用 Lambda SNS 触发器 的相关文章

随机推荐