Отключить / включить Lambda SNS Trigger программно - PullRequest
1 голос
/ 08 марта 2019

Мне нужно программно отключить лямбда-триггер SNS, однако я, похоже, не могу этого сделать.Я хочу, чтобы в консоли AWS Lambda было показано «Отключено» для функции:

lambda sns trigger

Вот код, который я пробовал:

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?Как можно это сделать?Я бы предпочел не отказываться от подписки / подписки, поскольку это вывело бы объекты подписки из области действия CloudFormation (правильно?).Однако я посмотрел на updateEventSourceMappings согласно документации, которая работает только с потоками DynamoDB, потоками Kinesis и SQS, но не с SNS.

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Похоже, что нет возможности "отключить" Lambda-подписку на тему SNS.

Я основываю свои рассуждения на следующих шагах, которые я предпринял:

  • Создана лямбда-функция AWS
  • Создана тема Amazon SNS
  • Подписал функцию Lambda на тему SNS (выполняется через консоль SNS)
  • Подтвердил в консоли Lambda, что функция подписки на SNS "включена"
  • Ран 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": []
}

Когда я включил снова, подписка вернулась.

Итак, я предполагаю, что, поскольку кнопка «отключить / включить» фактически добавляет и удаляет подписку , , похоже, не имеет никакой возможности «отключить» подписку .

0 голосов
/ 15 марта 2019

Я нашел (100%) правильный способ сделать это.Хотя ответ @John Rotenstein можно было бы использовать, он не совсем правильный, но все равно должен работать.

Я обнаружил, что при нажатии на тумблер политика лямбды фактически обновляется:

Включено:

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

Примечания:

  • API-интерфейс Lambda имеет стандартную настройку безопасности 100одновременное выполнение для каждой учетной записи в каждом регионе.
  • Обновлять политики на основе ресурсов для ресурсов Lambda можно только в рамках действий API AddPermission и AddLayerVersionPermission.Вы не можете создавать политики для своих ресурсов Lambda в JSON или использовать условия, которые не соответствуют параметрам для этих действий. См. Документы здесь

Кроме того, вы можете использовать Lambda.getPolicy, чтобы просмотреть политику лямбды, чтобы убедиться, что она обновлена.

...