本地Django Rest API连接AWS LND节点时找不到admin.macaroon文件
问题:本地Django API无法访问AWS上LND节点的admin.macaroon
我正尝试通过本地运行的Django Rest API连接AWS上的LND节点(已知这不是最佳部署方案,但此次别无选择)。尽管admin.macaroon文件存在于EC2实例的指定目录,但API始终提示找不到该文件,同时不清楚如何从外部API访问EC2实例,需要帮助。
1. Django View代码
class GetInfo(APIView): def get(self, request): REST_HOST = "https://ec2-18-195-111-81.eu-central-1.compute.amazonaws.com" MACAROON_PATH = "/home/ubuntu/.lnd/data/chain/bitcoin/mainnet/admin.macaroon" # url = "https://ec2-18-195-111-81.eu-central-1.compute.amazonaws.com/v1/getinfo" TLS_PATH = "/home/ubuntu/.lnd/tls.cert" url = f"https//{REST_HOST}/v1/getinfo" macaroon = codecs.encode(open(MACAROON_PATH, "rb").read(), "hex") headers = {"Grpc-Metadata-macaroon": macaroon} r = requests.get(url, headers=headers, verify=TLS_PATH) return Response(json.loads(r.text))
2. LND节点状态(lncli getinfo输出)
$ lncli getinfo: { "version": "0.15.5-beta commit=v0.15.5-beta", "commit_hash": "c0a09209782b1c62c3393fcea0844exxxxxxxxxx", "identity_pubkey": "mykey", "alias": "020d4da213770890e1c1", "color": "#3399ff", "num_pending_channels": 0, "num_active_channels": 0, "num_inactive_channels": 0, "uris": [ ....
3. 文件权限信息
$ ls -l total 138404 -rwxrwxr-x 1 ubuntu ubuntu 293 Feb 6 09:38 admin.macaroon drwxrwxr-x 2 ubuntu ubuntu 4096 Feb 5 14:48 bin drwxr-xr-x 6 ubuntu ubuntu 4096 Jan 27 20:17 bitcoin-22.0 drwxrwxr-x 4 ubuntu ubuntu 4096 Feb 1 16:39 go -rw-rw-r-- 1 ubuntu ubuntu 141702072 Mar 15 2022 go1.18.linux-amd64.tar.gz drwxrwxr-x 72 ubuntu ubuntu 4096 Feb 1 16:36 lnd -rw-rw-r-- 1 ubuntu ubuntu 0 Jan 27 20:13 screenlog.0
4. 报错信息
[Errno 2] No such file or directory:'/home/ubuntu/.lnd/data/chain/bitcoin/mainnet/admin.macaroon'
问题分析与解决步骤
核心问题:本地API读取的是本地路径,而非EC2上的文件
你的Django API运行在本地,代码里的MACAROON_PATH和TLS_PATH指向的是AWS EC2实例上的路径,本地机器根本没有这个目录,所以会提示文件不存在。
正确的访问流程
LND的REST API需要通过EC2公网地址访问,同时需要将EC2上的认证文件下载到本地,再调整代码配置:
下载EC2上的认证文件到本地
在本地终端通过scp命令复制文件:# 复制admin.macaroon到当前目录 scp ubuntu@ec2-18-195-111-81.eu-central-1.compute.amazonaws.com:/home/ubuntu/.lnd/data/chain/bitcoin/mainnet/admin.macaroon ./ # 复制tls.cert到当前目录 scp ubuntu@ec2-18-195-111-81.eu-central-1.compute.amazonaws.com:/home/ubuntu/.lnd/tls.cert ./然后修改Django代码里的路径为本地路径:
MACAROON_PATH = "./admin.macaroon" TLS_PATH = "./tls.cert"修复请求URL的拼写错误
代码里的url = f"https//{REST_HOST}/v1/getinfo"少了一个冒号,正确写法是:url = f"{REST_HOST}/v1/getinfo" # 或者直接写完整URL:"https://ec2-18-195-111-81.eu-central-1.compute.amazonaws.com:8080/v1/getinfo"注意:LND REST API默认端口是8080,需要在URL中加上端口号,除非你已经修改过LND配置将端口映射到443。
配置EC2安全组允许外部访问
- 打开EC2实例的安全组规则,添加一条入站规则:允许本地机器的IP访问8080端口(LND REST默认端口)
- 检查LND的
lnd.conf配置文件,确保restlisten参数设置为0.0.0.0:8080,允许外部IP访问
用curl验证请求可用性
先在本地用curl测试,确认API能正常响应:curl -v --cacert ./tls.cert -H "Grpc-Metadata-macaroon: $(xxd -ps -u -c 1000 ./admin.macaroon)" https://ec2-18-195-111-81.eu-central-1.compute.amazonaws.com:8080/v1/getinfo如果curl能返回正确结果,再调整Django代码即可正常调用。
内容的提问来源于stack exchange,提问作者Pau1aAm7
相关产品推荐
相关产品推荐

