未捕获(承诺中)错误:凭据丢失

问题描述 投票:0回答:1

我在 React 页面中执行了这个简单的表单:

import React, {useState} from 'react';
import { Link } from 'react-router-dom';
import {LambdaClient, InvokeCommand, LogType} from "@aws-sdk/client-lambda"; // ES Modules import
const { fromTemporaryCredentials } = require("@aws-sdk/credential-providers");


const FooterOne = ({ footerLight, style, footerGradient }) => {

  const handleSubmit = async (event) => {
    event.preventDefault();

    const credentials = await fromTemporaryCredentials({
      params: {
        RoleArn: "arn:aws:lambda:us-east-1:123456789:function:email-submit",
      },
      clientConfig: {
        region: 'us-west-2',
      },
    })();

    try {
      const client = new LambdaClient({
        region: 'us-west-2',
        credentials,
      });

      const command = new InvokeCommand({
        FunctionName: "email-submit",
        Payload: JSON.stringify("payload"),
        LogType: LogType.Tail,
      });

      const { Payload, LogResult } = await client.send(command);
      const result = Buffer.from(Payload).toString();
      const logs = Buffer.from(LogResult, "base64").toString();
      return { logs, result };
    } catch (error) {
      console.error('Error invoking function:', error);
      // Handle errors as needed
    }
  };

  return (
      <>
        <form onSubmit={handleSubmit}>
          <input
              type='text'
              placeholder='Enter your email'
              name='email'
              required=''
              autoComplete='off'
          />
          <input
              type='submit'
              value='Subscribe'
              data-wait='Please wait...'
          />
        </form>
      </>
  );
};

export default FooterOne;

将 Lambda 代码写入 AWS Lambda:

export const handler = async (event) => {
  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

但是我收到错误:

Uncaught (in promise) Error: Credential is missing
    at SignatureV4.credentialProvider (runtimeConfig.browser.js:22:1)
    at SignatureV4.signRequest (SignatureV4.js:103:1)
    at SignatureV4.sign (SignatureV4.js:58:1)
    at awsAuthMiddleware.js:24:1
    at async retryMiddleware.js:27:1
    at async loggerMiddleware.js:3:1
    at async fromTemporaryCredentials.js:20:1
    at async handleSubmit (FooterOne.js:12:1)

你知道我该如何解决这个问题吗?

javascript reactjs amazon-web-services aws-lambda aws-sdk
1个回答
0
投票

听起来您还没有设置 AWS .credentials。又名。伪用户名/密码之类的东西。

谷歌一下。 (我知道这很复杂,我并不是轻率,但这只是您需要了解 AWS .Credentials 文件如何工作的那些烦人的事情之一)

您需要提供身份验证详细信息,您的代码可以使用这些详细信息来证明它有权访问您的代码尝试与之通信的服务,以便它可以访问。又名。像这样的东西;

AWS.config.update({
    accessKeyId: "YOURKEY",
    secretAccessKey: "YOURSECRET"
}); 

老实说,这与打电话给银行没有什么不同。在这种情况下,银行就是您的代码。

在您证明自己的身份并且您有权与他们交谈之前,他们不会与您交谈。

你的代码就是你。你在打电话。像您一样思考,就像代码一样。

弄清楚这一点,你就会解决自己的问题。

© www.soinside.com 2019 - 2024. All rights reserved.