尝试在 AWS S3 上使用客户端 API 初始化 Datomic Cloud 时出现“无法读取密钥文件”错误

Posted

技术标签:

【中文标题】尝试在 AWS S3 上使用客户端 API 初始化 Datomic Cloud 时出现“无法读取密钥文件”错误【英文标题】:`Unable to read keyfile` error when trying to initialize Datomic Cloud with Client API on AWS S3 【发布时间】:2021-10-23 23:46:29 【问题描述】:

我正在测试使用 IntelliJ IDE 设置 Datomic Cloud。我正在关注 Datomic 的客户端 API,但在初始化客户端时卡住了。

来自 API 客户端的规范在这里,而 tut 在这里,在步骤 Using Datomic Cloud 下。

所以 tut 说要像这样初始化一个客户端:

(require '[datomic.client.api :as d])
(def cfg :server-type :ion
      :region "<your AWS Region>" ;; e.g. us-east-1
      :system "<system name>"
      :creds-profile "<your_aws_profile_if_not_using_the_default>"
      :endpoint "<your endpoint>")

如果不使用默认设置,他们说要包含 AWS 配置文件。据我所知,我使用的是默认值——我不是 AWS 组织的一部分。

这是来自我的 tutorial.core 命名空间的(部分编辑的)代码,我试图在其中初始化 Datomic:

(ns tutorial.core   
(:gen-class))
(require '[datomic.client.api :as d])
(def cfg :server-type :cloud
  :region "us-east-2"
  :system "roam"
  :endpoint "https://API_ID.execute-api.us-east-2.amazonaws.com"
  )
(def client (d/client cfg))
(d/create-database client :db-name "blocks")
(d/connect client :db-name "blocks")

但是,我从 Clojure 收到错误消息:Forbidden to read keyfile at s3://URL/roam/datomic/access/admin/.keys. Make sure that your endpoint is correct, and that your ambient AWS credentials allow you to GetObject on the keyfile.

我需要某种凭证吗?还有什么可能导致此错误吗?我从 CloudFormation Datomic 堆栈中的 ClientApiGatewayEndpoint 获得了端点 URL。

如果我应该提供更多信息,请告诉我!谢谢。 我尝试了这里提到的解决方案,但它不起作用,我在网上的任何地方都找不到这个问题的答案。

【问题讨论】:

你有文件~/.aws/credentials。它应该包含正确的凭据,例如[default] aws_access_key_id = YOUR_KEY_ID aws_secret_access_key = YOUR_CORRECT_SECRET_KEY。如果您要连接到具有不同配置文件名称的多个 aws 实例,您可以将该名称指定为 :creds-profile 的值,否则注释掉该行。 @Marcellinus 我没有:/ 我意识到你可以在配置中为 REPL 配置它,但我猜我还需要凭证文件才能在产品中运行?我尝试在网上搜索指南,但很难找到一些东西...... 检查这个:docs.datomic.com/cloud/getting-started/get-connected.html 【参考方案1】:

当您从计算机初始化客户端时,datomic 库会尝试使用您传递的任何 AWS 凭证访问 S3 以读取一些配置文件。您提到您使用的是默认配置文件,因此很可能您有一个 ~/.aws/credentials 文件,其中包含 [default] 条目以及访问密钥和密钥。

错误:

禁止读取位于 s3://URL/roam/datomic/access/admin/.keys 的密钥文件。 确保您的端点是正确的,并且您的环境 AWS 凭据允许您在密钥文件上获取对象。

表示 datomic 库无法从 S3 读取文件。出现这种情况的原因有很多。尝试使用 AWS cli 运行以下命令

aws s3 cp s3://URL/roam/datomic/access/admin/.keys .

我假设它会失败,这意味着您的默认配置文件没有必要的权限从 S3 读取此资源,因此您从 datomic.要修复它,您需要向您的 AWS 用户 IAM 角色添加必要的权限(密钥文件上的 GetObject,如错误消息所示)。

您可以尝试的一件事是创建个人资料。在你的~/.aws/credentials

[datomic]
aws_access_key_id = your-access-key
aws_secret_access_key = your-secret-key
region = us-east-2

然后将您的cfg 映射更改为:

(def cfg :server-type :cloud
  :region "us-east-2"
  :system "roam"
  :creds-profile "datomic"
  :endpoint "https://API_ID.execute-api.us-east-2.amazonaws.com"
  

【讨论】:

这是一个很好的答案。我昨天想通了,完全按照你说的做了。奇怪的是,Datomic 文档在这里说:docs.datomic.com/cloud/getting-started/configure-access.html 但您只需要 Datomic 9041 及以下版本(我使用的是 9095)。无论如何,谢谢!

以上是关于尝试在 AWS S3 上使用客户端 API 初始化 Datomic Cloud 时出现“无法读取密钥文件”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS s3 或 AWS s3api 递归更改文件夹的权限

通过 ElasticBeansStalk 上托管的 API Gateway 在 AWS S3 上上传图像

从托管在 S3 存储桶上的站点访问 AWS API 时出现 CORS 问题 [关闭]

在Angularjs中使用AWS API从S3代理生成Word文档无法打开“选择使您的文档可读的编码”

如何将 S3 用作静态网页和 EC2 作为 REST API 一起使用? (AWS)

尝试上传到 aws s3 存储桶时收到 400 Bad Request