尝试在 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文档无法打开“选择使您的文档可读的编码”