aws-sdk отправить запрос с IAM Auth

Я хотел бы, чтобы моя функция Lambda взаимодействовала со шлюзом API …

Однако я хочу, чтобы API-шлюз проверял запрос с помощью _1 _…, поэтому лямбда-функция должна каким-то образом подписывать запрос с помощью определенного токена IAM, я полагаю …

Я читал этот https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html, но я не могу найти ни одного примера того, как подписать запрос с конкретным пользователем IAM

(Я уже создал пользователя в IAM с AmazonAPIGatewayInvokeFullAccess, и у меня есть ключ доступа и секретный ключ, поэтому я полагаю, мне действительно нужно только то, как подписать запрос)

Процесс зависит от вашего языка программирования. Самый простой из них, о котором я знаю, по крайней мере, находится на python, так как для этого уже есть пакеты. Кроме того, для этого нельзя использовать aws-sdk. Он должен быть сторонним.   —  person Alberto Sinigaglia    schedule 23.02.2021

@Marcin, я бы хотел использовать NodeJS, если это возможно (но я искренне думаю, что был один SDK от AWS, который делает это автоматически)   —  person Alberto Sinigaglia    schedule 23.02.2021

SDK предназначены для управления API, а не для регулярных запросов конечных пользователей к нему. Для nodejs существует пакет this. Вы обдумывали это?   —  person Alberto Sinigaglia    schedule 23.02.2021

См. также:  AWS sam SES sendEmail возвращает InvalidClientTokenId (nodejs / lambda)
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Alberto Sinigaglia

    Нам нужно построить обычные параметры запроса nodejs с тремя дополнительными параметрами

    service: "execute-api" для Api Gateway

    region: "us-east-1" Регион AWS.

    body: postData, обычно мы передаем тело req.write, оно нам тоже нужно в опциях, потому что оно нужно для подписи.

    и, наконец, aws4.sign(...) передается request.

    Все, что делает метод .sign, — это добавляет 4 дополнительных заголовка X-Amz-Content-Sha256, X-Amz-Security-Token, X-Amz-Date и Authorization

    var aws4 = require("aws4");
    var https = require("https");
    
    const requestBody = { name: "test" };
    var postData = JSON.stringify(requestBody);
    
    var options = {
      method: "POST",
      hostname: "abcdefgh.execute-api.us-east-1.amazonaws.com",
      path: "/qa",
      headers: {
        "Content-Type": "application/json",
      },
      service: "execute-api",
      region: "us-east-1",
      body: postData,
      maxRedirects: 20,
    };
    
    const signedRequest = aws4.sign(options, {
      secretAccessKey: "abcadefghijknlmnopstabcadefghijknlmnopst",
      accessKeyId: "ABCDEFGHIJKLMNOPQRST",
      sessionToken: "this is optional ==",
    });
    console.log(signedRequest);
    var req = https.request(signedRequest, function (res) {
      var chunks = [];
    
      res.on("data", function (chunk) {
        chunks.push(chunk);
      });
    
      res.on("end", function (chunk) {
        var body = Buffer.concat(chunks);
        console.log(body.toString());
      });
    
      res.on("error", function (error) {
        console.error(error);
      });
    });
    req.write(postData);
    req.end();
    

    поскольку этот вызов выполняется из лямбда-выражения, весь объект с ключами можно пропустить и просто вызвать aws4.sign(options), он должен использовать переменные среды.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: