Cloud backend for
hello.nrfcloud.com/map developed
using AWS CDK in
TypeScript.
Install the dependencies:
npm ciThe single-cell geo-location features uses the nRF Cloud Ground Fix API which requires the service to be enabled in the account's plan. Manage the account at https://nrfcloud.com/#/manage-plan.
Provide your nRF Cloud API key:
./cli.sh configure-nrfcloud-account apiKey <API key>The history is persisted in the
backend, and the frontend
requests device history using the same API as the
web application, however since public
devices don't have a fingerprint, a JWT is created for public devices by the map
backend, which is then used by the backend to authenticate history requests for
devices. The following command installs a JWT keypair, and the public key is
published at https://api.nordicsemi.world/.well-known/jwks.json.
./cli.sh generate-jwt-keypairSome of the feature are run from docker containers, ensure they have been built and published before deploying the solutions.
export OPENSSL_LAMBDA_CONTAINER_TAG=$(./cli.sh build-container openssl-lambda)
# You can add these outputs to your .env file
echo "export OPENSSL_LAMBDA_CONTAINER_TAG=$OPENSSL_LAMBDA_CONTAINER_TAG" >> .envrc
direnv allownpx cdk bootstrap # if this is the first time you use CDK in this account
npx cdk deployYou can specify a custom domain name for the deployed API using the environment
variable API_DOMAIN_NAME.
If you do so, make sure to create a certificate in the region for this domain name.
Create a role in the account that manages the domain name, to allow the the
production account to update the CNAME for the API domain with these permissions
(make sure to replace <Hosted Zone ID>, <api domain name>):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "route53:ChangeResourceRecordSets",
"Resource": "arn:aws:route53:::hostedzone/<Hosted Zone ID>",
"Condition": {
"ForAllValues:StringEquals": {
"route53:ChangeResourceRecordSetsNormalizedRecordNames": [
"<api domain name>"
],
"route53:ChangeResourceRecordSetsRecordTypes": ["CNAME"],
"route53:ChangeResourceRecordSetsActions": ["UPSERT"]
}
}
},
{
"Effect": "Allow",
"Action": "route53:ListHostedZonesByName",
"Resource": "*"
}
]
}Then, for continuous deployment:
- create the variable
API_DOMAIN_NAMEwith the name of the api domain, e.g.api.nordicsemi.world - create the secret
API_DOMAIN_ROUTE_53_ROLE_ARNwith the role ARN of the role that allows the production account to update the CNAME for the API domain.
gh variable set API_DOMAIN_NAME --env production --body api.nordicsemi.world
gh secret set API_DOMAIN_ROUTE_53_ROLE_ARN --env production --body arn:aws:iam::<account ID>:role/<role name>After deploying the stack manually once,
- configure a GitHub Actions environment named
production - create the secret
AWS_ROLEwith the valuearn:aws:iam::<account ID>:role/<stack name>-cdand a variable (use thecdRoleArnstack output) - create the variable
AWS_REGIONwith the value<region>(your region) - create the variable
STACK_NAMEwith the value<stack name>(your stack name)
to enable continuous deployment.