在 amplify 中获取 aws_access_key_id 和 aws_secret_access_key

Get aws_access_key_id and aws_secret_access_key in amplify

我正在使用 create-react-app 构建一个 React 应用程序,它使用 javascript aws sdk 连接到 dynamodb。我让它在本地工作,但是当托管在 AWS Amplify 上时我无法让它工作。我的症结是我不知道如何将 Amplify 中的 aws_access_key_id 和 aws_secret_access_key 传递给 React 应用程序。

在本地,我有一个包含 REACT_APP_AWS_ACCESS_KEY_IDREACT_APP_AWS_SECRET_ACCESS_KEY 的 .env 文件。这些当然没有在Amplify中定义。

在 package.json 中,我尝试在构建脚本中设置变量。我什至尝试单独使用 access_key_id 来排除一次设置两个变量的问题。

"scripts": {
    "build": "REACT_APP_AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID REACT_APP_AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY react-scripts build",
  },

但是,这会导致 REACT_APP_ 变量的值为空。

我尝试以两种不同的方式修改 Amplify 应用程序构建设置,有和没有 package.json 更改,也没有成功。

build:
      commands:
        - npm run build
        - echo "REACT_APP_AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> .env
build:
      commands:
        - npm run build
        - echo "REACT_APP_AWS_ACCESS_KEY_ID=$REACT_APP_AWS_ACCESS_KEY_ID" >> .env

我不知道我还能做什么,或者我是否完全走错了路。我非常确定当应用程序在生态系统中 运行 时,AWS 环境会注入这些,因为我已经看到它与 Elastic Beanstalk 上托管的不同应用程序一起工作。

最终我需要的是 access_key_id 和 secret_access_key 用于 javascript aws sdk 来初始化 dynamodb 客户端。

const client = new DynamoDB({
  region: 'us-east-1',
  credentials: {
    accessKeyId: process.env.REACT_APP_AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.REACT_APP_AWS_SECRET_ACCESS_KEY
  }
});

如果您希望 amplify 能够在构建时访问它们,您需要 set env vars 在 amplify 控制台中。

我相信你知道这一点,但以这种方式将你的 aws 凭证包含在你的 React 客户端包中几乎总是一个非常糟糕的主意。您的所有网络用户都可以读取您的明文机密。

As Aws reminds us: Storing sensitive values, such as API keys, inside these frontend framework prefixed environment variables is not a best practice and is highly discouraged