如何从我的 Jelastic 环境中查询内部部署的 API?
How can I query an internally deployed API from my Jelastic environment?
我正在编写部署两个节点的 Jelastic 清单。在一个节点上,我有一个 API 需要查询才能设置第二个节点。这些方面的内容:
type: install
name: My test
nodes:
- count: 1
cloudlets: 4
nodeGroup: auth
nodeType: docker
image: my-api:latest
- count: 1
cloudlets: 16
nodeGroup: cp
nodeType: docker
image: some-service:latest
onInstall:
- script: |
import com.hivext.api.core.utils.Transport;
try {
const body = new Transport().get("http://${nodes.auth.master.intIP}:9011/api/key", {
"Authorization": "my-api-key"
});
return { result: 0, body: body };
} catch (e) {
return {
type: "error",
message: "unknown error: " + e
};
}
在我的脚本中,当我这样做时
const body = new Transport().get("http://www.google.com");
有效,我得到了 google 页面的正文内容。然而,
const body = new Transport().get("http://${nodes.auth.master.intIP}:9011/api/key", {
"Authorization": "my-api-key"
});
returns
ERROR: script.response: {"type":"error","message":"unknown error: JavaException: java.io.IOException: Failed to select a proxy"}
我做错了什么?如何在上面代码片段中的脚本中查询我的服务?当我 curl
通过常规 cmd
时,它会起作用:
curl -s -H "Authorization: my-api-key" http://${nodes.auth.master.intIP}:9011/api/key
另外,顺便说一句,我在哪里可以找到com.hivext.api.core.utils.Transport
的文档?
您无法通过脚本中的内部 IP 访问您的环境节点(至少不能保证)。
作为解决方法,您可以通过 public IP or endpoint 访问您的节点。
如果 public IP 或端点不适用于您的情况,并且您的服务只能在内部访问,您可以尝试通过 curl 和 ExecCmd API 访问您的节点。例如:
type: install
name: My test
nodes:
- count: 1
cloudlets: 4
nodeGroup: auth
nodeType: docker
image: my-api:latest
- count: 1
cloudlets: 16
nodeGroup: cp
nodeType: docker
image: some-service:latest
onInstall:
- script: |
function execInternalApi(nodeId, url) {
let resp = api.env.control.ExecCmdById({
envName: '${env.name}',
nodeId: nodeId,
commandList: toJSON([{
command: 'curl -fSsl -H "Authorization: my-api-key" \'' + url + '\''
}])
})
if (resp.result != 0) return resp
return { result: 0, out: resp.responses[0].out }
}
let body = execInternalApi(${nodes.auth.master.id}, 'http://localhost:9011/api/key');
return { result: 0, body: body };
我正在编写部署两个节点的 Jelastic 清单。在一个节点上,我有一个 API 需要查询才能设置第二个节点。这些方面的内容:
type: install
name: My test
nodes:
- count: 1
cloudlets: 4
nodeGroup: auth
nodeType: docker
image: my-api:latest
- count: 1
cloudlets: 16
nodeGroup: cp
nodeType: docker
image: some-service:latest
onInstall:
- script: |
import com.hivext.api.core.utils.Transport;
try {
const body = new Transport().get("http://${nodes.auth.master.intIP}:9011/api/key", {
"Authorization": "my-api-key"
});
return { result: 0, body: body };
} catch (e) {
return {
type: "error",
message: "unknown error: " + e
};
}
在我的脚本中,当我这样做时
const body = new Transport().get("http://www.google.com");
有效,我得到了 google 页面的正文内容。然而,
const body = new Transport().get("http://${nodes.auth.master.intIP}:9011/api/key", {
"Authorization": "my-api-key"
});
returns
ERROR: script.response: {"type":"error","message":"unknown error: JavaException: java.io.IOException: Failed to select a proxy"}
我做错了什么?如何在上面代码片段中的脚本中查询我的服务?当我 curl
通过常规 cmd
时,它会起作用:
curl -s -H "Authorization: my-api-key" http://${nodes.auth.master.intIP}:9011/api/key
另外,顺便说一句,我在哪里可以找到com.hivext.api.core.utils.Transport
的文档?
您无法通过脚本中的内部 IP 访问您的环境节点(至少不能保证)。 作为解决方法,您可以通过 public IP or endpoint 访问您的节点。 如果 public IP 或端点不适用于您的情况,并且您的服务只能在内部访问,您可以尝试通过 curl 和 ExecCmd API 访问您的节点。例如:
type: install
name: My test
nodes:
- count: 1
cloudlets: 4
nodeGroup: auth
nodeType: docker
image: my-api:latest
- count: 1
cloudlets: 16
nodeGroup: cp
nodeType: docker
image: some-service:latest
onInstall:
- script: |
function execInternalApi(nodeId, url) {
let resp = api.env.control.ExecCmdById({
envName: '${env.name}',
nodeId: nodeId,
commandList: toJSON([{
command: 'curl -fSsl -H "Authorization: my-api-key" \'' + url + '\''
}])
})
if (resp.result != 0) return resp
return { result: 0, out: resp.responses[0].out }
}
let body = execInternalApi(${nodes.auth.master.id}, 'http://localhost:9011/api/key');
return { result: 0, body: body };