I have self hosted cloud-pricing-api in my server ...
# help
m
I have self hosted cloud-pricing-api in my server which doesn’t have internet/blocked by firewall...is there any way to update manually and where i can see/change the actual pricing URLs
b
Downloading pricing updates is optional, it's convenient as we collect all prices in one file. It is possible to download prices from cloud vendors directly without using Infracost data. This is a dedicated command:
npm run data:scrape
There are no default firewall rules, this allows you to decide which way you'd like to protect the self-hosted CPAPI endpoints.
Does this answer your question?
m
Thanks for details. my firewall allows only limited domains like *aws etc....i will try to npm run data:scrape and see.
b
It's a long process and it may require API keys for cloud vendors (for example, for Google) to use their APIs. The ideal solution would be whitelisting the Infracost domain
m
Thank you for all the details
b
Sure thing! 🙂
m
@busy-agent-35515 for the first run of cloud-pricing-api, need internet egress call for which is either init_job or data:scape right?
b
Yes, to work properly the CPAPI needs data. It either downloads the data dump from Infracost via
npm run job:init
or you run the scraper. With the scrape approach you can also choose the cloud vendor, these are the available options for the flag
--only=[aws:bulk,aws:spot,azure:retail,gcp:catalog,gcp:machineTypes]
BTW, how do you deploy the CPAPI? Docker, k8s or as a node app?
m
As podman, within firewall... currently we are doing POC
b
Thank you. I assume that you're using the docker-compose.yml as an example then mentioning
init_job
m
Yes, correct. all clear so far
b
Awesome!
BTW, we've recently released a GitHub App integration in Infracost Cloud. It allows a super easy setup without need to use CI/CD pipeline. Ali wrote about this in a blog post https://www.infracost.io/blog/oct-2022-update/#github-app
Maybe it can work as a PoC for you
m
Thank you and really helpful
@busy-agent-35515 1st i have created network as
docker network create cloud_pricing_api
which created bridge network 2nd run postgres:13.4 as container, started successfully
starting PostgreSQL 13.4 (Debian 13.4-4.pgdg110+1) on x86 _64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
listening on IPv4 address"0.0.0.0".port 5432
listening on IPv6 address"::", port 5432
listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
database system was shut down at 2022-10-19 07:09:16 UTC
database system is ready to accept connections
3rd when i run init job, getting below error after 10 retry
{"level":50,"time":1666164483057,'pid :29, " hostname": "545af87929a2"msg': "Waiting for Postgres@L
to become available: connect ECONNREFUSED 127.0.0.1:5432 }
("level":50, "time":1666164493066, "pid":29, "hostnalme" •"545af8792922"erp"Error."message":""Failed to connect to PostereSOL". "stack": "Error: Failed to connect to PostereSOLIn
at /usr/src/app/dist/cmd/db
Setup.js:80:31\n
at step (/usr/src/app/dist/cmd/dbSetup.is:33:23)\n
Object.next (/usr/src/app/dist/cmd/dbSetup.is:14:53n
at fulfilled (/usr/src/app/dist/cmd/dbSetup.JS:5:58)h,msg:Falledtoconnect
to PostgreSOL"}
nom ERRI Code ELIFECYCLE
nom ERR. errno 1
pm ERR! Cloud-pricing-api@0.3.7 db: setup:
*node dist/cmd/dbSetup.js
nom ERR.
pm ERR! Failed at the cloud-pricing-apige.3.7 db:setup script.
nom ERRI This is probablv not a problem with nom.
mare
likely
additional lossing
outnut above.
pm ERR! A complete log of this run can be found in:
/root/.npm/_logs/2022-10-19T07_28_13_0872-debug.log
nom ERR! Code ELIFECYCLE
errno
pm ERR! cloud-pricing-api@@.3.7 job:init: 'npm run db:setup && npm run job:update
npm ERR! Exit status
pm ERR! Failed at the cloud-pricing-api@o.3.7 job: init script.
npm ERR. In1s 15 probably not a problem witn nom.
There is likely additional logging output above.
pm ERR! A complete l0g of this run can be found in:
nomER
/root/.npm/_logs/2022-10-19T07_28_13_118-debug.10g
pls help how to fix this. Highly appriciated
b
Hey! On the first glance
connect ECONNREFUSED 127.0.0.1:5432
looks suspicious, it tries to connect to localhost, not your network. Does the init_job container use the network?
It relies on
POSTGRES_HOST=postgres
and
networks: - cloud_pricing_api
in the docker-compose.yml
m
@busy-agent-35515 Yes i run the below podman commands, anything i am missing here?
Copy code
docker network create cloud _pricing_api

#db
docker run -d\
--network cloud pricing api \
-v postgres-data:/var/lib/postgresql/data/ \
-u posteres \
- POSTGRES_PASSWORD=postgres \
--health-cmd="CMD-SHELL" \
--health-cmd="pg_isready" \
--health-interval=60s \
--health-timeout=10s \
--health-retries=3 \
--health-start-period=10s \
-restart on-failure \
postgres:13.4

#init job
docker run
--network cloud pricing_api \
-e INFRACOST_API KEY \
-e POSTGRES_HOST \
-e POSTGRES_DB \
-e POSTGRES_USER \
-e POSTGRES_PASSWORD \
cloud-pricing-api:latest npm run job:init
i tried with POSTGRES_HOST as localhost and postgress… both the ways its not working.
b
Can you try adding
Copy code
-h postgres
to the postgres container? This way you'll set its hostname, so you can use
POSTGRES_HOST=postgres
with the init job (and other containers that depend on the db)
m
i did this.. now different error during init_job
Waiting for PostgreSQL to become available: getaddrinfo ENOTFOUND postgres
@busy-agent-35515 i suspect something todo with network? i see default bridge nework is created with
docker network create cloud _pricing_api
b
Hm, weird. Okay. Maybe you can get the IP of the postgres container for now and use it as a env var host?
Yes, this is not related to CPAPI functionality, just the network setup
m
sure will try with its ip
b
With our docker-compose config they see each other no problem, however something's tricky happens here
I also apologize as I'm not an expert with docker networking 😅
Doing some googling, seems like podman sets hostnames using containers' names. Another option to try - set a name to the postgres container
--name postgres
instead of
-h
one
And it seems running
podman pod inspect <container>
should tell you what the hostname is
m
@busy-agent-35515 after changing
--network host
,
init_job
it,
data_scare
working with download errors, now i am getting new error while dataDownload & dataScpae both
There was an error downloading data: connect EINVAL 0.0.1.187:80 - Local (0.0.0.0:0)
I can confirm that no issue with infracost.io, amazonaws.com,*googleapis.com,*azure.com domain access
b
Hm, the dataDownload tries to reach
<https://pricing.api.infracost.io>
. Quick googling showed that the reason for this error might be missing protocol (https://), but I find it strange as the default endpoint certainly has it. Here's an SO where I found it https://stackoverflow.com/questions/48939454/error-connect-einval-0-0-xx-xx80-local-0-0-0-00
m
strange
@busy-agent-35515 i can confirm that am able to download the dump.tgz usung curl command inside the CPAPI container (using docker exec). However when i run the init job getting error
There was an error downloading data: connect EINVAL 0.0.1.187:80 - Local (0.0.0.0:0)
any workaround or fix please? Appreciated your help
b
Just to double check, you don't have
INFRACOST_PRICING_API_ENDPOINT
env var set, right?
m
Correct I haven't set INFRACOST_PRICING_API_ENDPOINT
b
Okay. Plan B. You have the dump file downloaded, that's good. You can use another command
npm data:load --path=path/to/file
to populate the database. I'm sorry, it's not the solution for the issue, but it should help unblock you with the CPAPI
Oops, hold on, I might be mistaken with the command Nope, all's good. The task expects
csv.gz
file
m
@busy-agent-35515 CPAPI using Node version v14.15.4 & npm version 6.14.10 should be okey?
b
Hm, we use 16.13
I guess using 16.14 should be alright too
m
Will update to 16.14 and test. will see how it goes
@busy-agent-35515 after updating to 16.14, during init_job, getting EACCES permission denied error... I need to set permissions?
b
Seems like your user doesn't have permissions to delete files. I guess you can either run as root, or use a custom user and use a directory different from
/root
to save/delete these files
m
@busy-agent-35515 @white-airport-8778 I have hosted CPAPI locally running http://localhost:4000, genereted $SELF_HOSTED_INFRACOST_API_KEY After auth login api key stored in ~/.config/infracost/credentials.yml export INFRACOST_PRICING_API_ENDPOINT= http://localhost:4000 export INFRACOST_API_KEY=$SELF_HOSTED_INFRACOST_API_KEY export INFRACOST_API_KEY=“<<MY API KEY>>” infracost configure set pricing_api_endpoint http://localhost:4000 infracost configure set api_key $SELF_HOSTED_INFRACOST_API_KEY infracost configure set tls_insecure_skip_verify true i can confirm that
curl -i $INFRACOST_PRICING_API_ENDPOINT/health
is 200 okey,
curl -i $INFRACOST_PRICING_API_ENDPOINT/graphql -H "X-Api-Key: $SELF_HOSTED_INFRACOST_API_KEY
is 400 Get query missing when i run infracost breakdown --path .
Error while Retrieving cloud prices to calculate costs
Error: Invalid API key
Please check your /home/user1/.config/infracost/credentials.yml or INFRACOST_API_KEY env variable.
i am 200% sure that /home/user1/.config/infracost/credentials.yml key is correct. What wrong here ? thanks in Advance
b
Okay, it seems like there is some confusion about the API keys. Let me reiterate a bit: 1. First, there are 2 apps in use: the CPAPI and CLI 2. CPAPI needs to have
SELF_HOSTED_INFRACOST_API_KEY
generated and exported - this is the key that CLI will use to authenticate with it (for example, it will be
cpapi-key
). For CPAPI you can also set up
INFRACOST_API_KEY
with the one you got from Infracost - this is needed to update the database. For example, it will be
infra-key
. 3. On CLI side you need to configure two env vars:
INFRACOST_PRICING_API_ENDPOINT
to point to your CPAPI (you mentioned
<http://localhost:4000>
). And CLI should also have
INFRACOST_API_KEY
generated by CPAPI, from example it should be
cpapi-key
This is important, because CLI tries to connect to your instance of CPAPI, it should use its key
cpapi-key
, not the one Infracost generated for you.
You can either set the CLI's env vars, or set the credentials yaml with the following values:
Copy code
api_key: cpapi-key
pricing_api_endpoint: <http://localhost:4000>
The env vars take precedence over the config file
If I read your message correctly the confusion comes from these lines:
Copy code
export INFRACOST_API_KEY=$SELF_HOSTED_INFRACOST_API_KEY
export INFRACOST_API_KEY="<<MY API KEY>>"
m
Thanks you for detailed response, seems typo in the question...what i set is export SELF_HOSTED_INFRACOST_API_KEY=$SELF_HOSTED_INFRACOST_API_KEY export INFRACOST_API_KEY="<<INFRACOST KEY>>" CLI side i set endpoint, generated cpapi-key Same error
Also i noticed is when i set infracost configue set api_key=generated cpapi-key, its overriding credentials.yml file
b
This is correct, that's the purpose of the
configure set
command - it stores values in the credentials yaml
m
Tried 3/4 times same error
b
This should be done for CPAPI:
Copy code
export SELF_HOSTED_INFRACOST_API_KEY=$SELF_HOSTED_INFRACOST_API_KEY
export INFRACOST_API_KEY=infra-key
And this should be done for CLI:
Copy code
export INFRACOST_PRICING_API_ENDPOINT=<http://localhost:4000>
export INFRACOST_API_KEY=cpapi-key
It's important that the export is done in different sessions
Can you try to run this command?
INFRACOST_API_KEY=cpapi-key infracost breakdown --path .
replacing the cpapi-key with your actual key?
This way it would apply specifically for the command ignore anything set in your environment
m
I set all env vars in one session and trying to run
infracost breakdown --path .
Is this could be issue?
b
echo $INFRACOST_API_KEY
Which key does it show?
and
echo $SELF_HOSTED_INFRACOST_API_KEY
?
m
I set $INFRACOST_API_KEY with infracost given key and $SELF_HOSTED_INFRACOST_API_KEY with generated key in the CLI breakdown session Seems these are clashing. Do i need to set only one ?
b
CPAPI needs both, CLI needs only INFRACOST_API_KEY with the one you generated in CPAPI
If you're running both apps in the same session, CLI will use INFRACOST_API_KEY that Infracost provided. Connecting to your localhost will result in error, because your CPAPI app doesn't recognize this key
If you run the CLI command using this notation
INFRACOST_API_KEY=cpapi-key infracost breakdown --path .
it should not clash. Can you try that?
m
Got it...yes my CPAPI & CLI running in same server.. so will try with given suggetion and let you know. Thank you for all details
b
Good luck!
m
@busy-agent-35515 awesome `INFRACOST_API_KEY=cpapi-key infracost breakdown --path .`worked. My suggestion is add a special note for localhost users regarding for CPAPI and CLI ENV vars usage
b
Great to hear! And thanks for the suggestion. Usually the localhost setup uses
.env
file where the env vars are defined. And we recommend to use the docker compose approach as it's fast and clean. Unfortunately, we can't account for all the corner cases. Sorry, that your case was one of those 🙂