簡體   English   中英

在 nodejs 中的 lambda function 中的 AWS IAM 授權

[英]AWS IAM authorization inside a lambda function in nodejs

我有一個受 IAM 授權保護的 API,這是一個允許 IAM 用戶 integ integ-user調用 API 的資源策略。

現在我想寫一個 lambda function 來調用相同的 API。 鑒於我可以訪問 IAM 訪問密鑰和密鑰(通過環境變量或 AWS Secret Manager),我如何對用戶進行 IAM 授權,以便它可以成功調用 API?

用於調用相同 API 的示例代碼(未經 IAM 授權):

var https = require('https');

exports.handler = (event, context, callback) => {
    const options = {
        host: process.env.VPCE_DNS_NAME,
        port: 443,
        path: "/status",
        method: 'GET',
        headers: {
          'Host':process.env.API_GW_ENDPOINT
        }
      };

    https.request(options, (res) => {
      let data = '';
      res.on('data', (d) => {
       data += d;
        process.stdout.write(d);
      });
      res.on('end', () => {
         callback(null, JSON.parse(data));
      });
    }).on('error', (e) => {
      callback(null, e);
    }).end();
};

我們需要使用三個附加參數構建常規 nodejs 請求選項

service: "execute-api"

region: "us-east-1" AWS 區域。

body: postData ,通常我們傳遞 body req.write ,我們在 options 中也需要它,因為它是簽名所必需的。

最后將aws4.sign(...)傳遞給request

.sign方法所做的只是添加 4 個額外的標頭X-Amz-Content-Sha256X-Amz-Security-TokenX-Amz-DateAuthorization

var aws4 = require("aws4");
var https = require("https");

const requestBody = { name: "test" };
var postData = JSON.stringify(requestBody);

var options = {
  method: "GET",
  hostname: "abcdefgh.execute-api.us-east-1.amazonaws.com",
  path: "/status",
  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();

由於此調用是從 lambda 整個 object 進行的,因此可以跳過鍵並簡單地調用aws4.sign(options) ,它應該從環境變量中使用。

暫無
暫無

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

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