Giter VIP home page Giter VIP logo

awslabs / fhir-works-on-aws-deployment Goto Github PK

View Code? Open in Web Editor NEW
296.0 23.0 160.0 9 MB

A serverless implementation of the FHIR standard that enables users to focus more on their business needs/uniqueness rather than the FHIR specification

License: Apache License 2.0

JavaScript 6.81% TypeScript 74.69% Python 3.59% Dockerfile 0.19% Shell 4.90% PowerShell 4.00% Java 5.82%
hl7 fhir healthcare nodejs aws typescript fhir-works

fhir-works-on-aws-deployment's Introduction

FHIR Works on AWS deployment

This GitHub repository has been migrated. You can now find FHIR Works on AWS at https://github.com/aws-solutions/fhir-works-on-aws.

Upgrade notice

Versions 3.1.1 and 3.1.2 of the fhir-works-on-aws-authz-smart package have been deprecated for necessary security updates. Please upgrade to version 3.1.3 or higher. For more information, see the fhir-works-on-aws-authz-smart security advisory.

Summary

FHIR Works on AWS is a framework that can be used to deploy a FHIR server on AWS. Using this framework, you can customize and add different FHIR functionality to best serve your use cases. When deploying this framework, by default Cognito and role based access control is used. However, if preferred, you can be authenticated and authorized to access the FHIR server’s resources by using SMART instead of Cognito. Cognito is the default AuthN/AuthZ provider because it is easier to configure than SMART. It doesn’t require setting up a separate IDP server outside of AWS as compared to SMART. However, Cognito authentication is not granular. When a new user is created, it is assigned into the auditor, practitioner, or non-practitioner groups. Depending on the group, the user gets access to different groups of FHIR resources. The AuthN/Z providers are defined in package.json and config.ts. You can choose appropriate providers. SMART allows greater granularity into authentication than Cognito and is the FHIR standard. It allows you to access a FHIR record only if that record has reference to the user.

FHIR Works on AWS features

FHIR Works on AWS utilizes AWS Lambda, Amazon DynamoDB, Amazon S3 and Amazon Elasticsearch Service to provide the following FHIR features:

  • Create, Read, Update, Delete (CRUD) operations for all R4 or STU3 base FHIR resources
  • Search capabilities per resource type
  • Ability to do versioned reads (vread)
  • Ability to post a transaction bundle of 25 entries or less. Presently, transaction bundles with only 25 entries or less are supported.

Accessing FHIR Works on AWS

The easiest and quickest way to access FHIR Works on AWS is by using AWS solution. To modify the code and set up a developer environment, follow the steps below:

Note: AWS Solution provides an earlier version(See Solutions CHANGELOG for more details) of FWoA install. Please follow the instruction below to install from GitHub repository if you wish to install the latest version.

  1. Clone or download the repository to a local directory.

Example:

git clone https://github.com/awslabs/fhir-works-on-aws-deployment.git

Note: To modify FHIR Works on AWS, create your own fork of the GitHub repository. This allows you to check in any changes you make to your private copy of the code.

  1. Use one of the following links to download FHIR Works on AWS:
  1. Refer to these instructions for making code changes.

If you intend to use FHIR Implementation Guides read the Using Implementation Guides documentation first.

If you intend to do a multi-tenant deployment read the Using Multi-Tenancy documentation first.

If you intend to use FHIR Subscriptions read the Using Subscriptions documentation first.

Architecture

The system architecture consists of multiple layers of AWS serverless services. The endpoint is hosted using API Gateway. The database and storage layer consists of Amazon DynamoDB and S3, with Elasticsearch as the search index for the data written to DynamoDB. The endpoint is secured by API keys and Cognito for user-level authentication and user-group authorization. The diagram below shows the FHIR server’s system architecture components and how they are related.

Architecture

Components overview

FHIR Works on AWS is powered by single-function components. These functions provide you the flexibility to plug your own implementations, if needed. The components used in this deployment are:

  • Interface - Defines communication between the components.
  • Routing - Accepts HTTP FHIR requests, routes it to the other components, logs the errors, transforms output to HTTP responses and generates the Capability Statement.
  • Authorization - Accepts the access token found in HTTP header and the action the request is trying to perform. It then determines if that action is permitted.
  • Persistence - Contains the business logic for creating, reading, updating, and deleting the FHIR record from the database. FHIR also supports ‘conditional’ CRUD actions and patching.
    • Bundle - Supports multiple incoming requests as one request. Think of someone wanting to create five patients at once instead of five individual function calls. There are two types of bundles, batch and transaction. We currently only support transaction bundles of size 25 entries or fewer, but support batch bundles of up to 750 entries. This 750 limit was drawn from the Lambda payload limit of 6MB and an average request size of 4KB, divided in half to allow for flexibility in request size. This limit can also be configured in the config.ts, by specifying the maxBatchSize when constructing the DynamoDBBundleService.
  • Search - Enables system-wide searching (/?name=bob) and type searching (/Patient/?name=bob).
  • History - (Not implemented) Searches all archived/older versioned resources. This can be done at a system, type or instance level.

License

This project is licensed under the Apache-2.0 license.

Setting variables for FHIR on AWS

Retrieving user variables

After installation, all user-specific variables (such as USER_POOL_APP_CLIENT_ID) can be found in the Info_Output.log file. You can also retrieve these values by running the following command:

serverless info --verbose --region <REGION> --stage <STAGE>.

Note: The default stage is dev and region is us-west-2.

If you are receiving Error: EACCES: permission denied when running a command, try re-running it using sudo.

Accessing the FHIR API

The FHIR API can be accessed through API_URL using the following REST syntax:

curl -H "Accept: application/json" -H "Authorization: Bearer <COGNITO_AUTH_TOKEN>" -H "x-api-key:<API_KEY>" <API_URL>

For more information, click here.

Using Postman to make API requests

To access APIs, you can use Postman as well. Postman is an API Client for RESTful services that can run on your development desktop for making requests to the FHIR Server. Postman is highly suggested and enables easier access to the FHRI API. You can use Postman to make API requests by following the steps below:

Importing the collection file

Under the Postman folder, you can access the JSON definitions for some API requests that you can make against the server. To import these requests into your Postman application, click here.

Note: Ensure that you import the Fhir.postman_collection.json collection file.

After you import the collection, set up your environment. You can set up a local environment, a development environment, and a production environment. Each environment should have the correct values configured. For example, the value for API_URL for the local environment might be localhost:3000 while the API_URL for the development environment would be your API gateway’s endpoint.

Setting up environment variables

Set up the following three Postman environments:

  • Fhir_Local_Env.json
  • Fhir_Dev_Env.json
  • Fhir_Prod_Env.json

For instructions on importing the environment JSON, click here.

The COGNITO_AUTH_TOKEN required for each of these files can be obtained by following the instructions under Authorizing a user.

The following variables required in the Postman collection can be found in Info_Output.log:

  • API_URL: from Service Information:endpoints: ANY
  • API_KEY: from Service Information: api keys: developer-key

To find what FHIR Server supports, use the GET Metadata Postman request to retrieve the Capability Statement

Authorizing a user

FHIR Works on AWS uses Role-Based Access Control (RBAC) to determine what operations and what resource types a user can access. The default rule set can be found in RBACRules.ts. To access the API, you must use the ID token. This ID token must include scopes of either openid, profile or aws.cognito.signin.user.admin.

Using either of these scopes provide information about users and their group. It helps determine what resources/records they can access.

  • The openid scope returns all user attributes in the ID token that are readable by the client. The ID token is not returned if the openid scope is not requested by the client.
  • The profile scope grants access to all user attributes that are readable by the client. This scope can only be requested with the openid scope.
  • The aws.cognito.signin.user.admin scope grants access to Amazon Cognito User Pool API operations that require access tokens, such as UpdateUserAttributes and VerifyUserAttribute.

For more information, click here.

Retrieving an ID token using aws.cognito.signin.user.admin

To access the FHIR API, an ID token is required. A Cognito ID token can be obtained using the following command substituting all variables with their values from Info_Output.log.

  • For Windows, enter:
scripts/init-auth.py <CLIENT_ID> <REGION>
  • For Mac, enter:
python3 scripts/init-auth.py <CLIENT_ID> <REGION>

The return value is the COGNITO_AUTH_TOKEN (found in the postman collection) to be used for access to the FHIR APIs.

Accessing binary resources

Binary resources are FHIR resources that consist of binary/unstructured data of any kind. This could be X-rays, PDF, video or other files. This implementation of the FHIR API has a dependency on the API Gateway and Lambda services, which currently have limitations in request/response sizes of 10 MB and 6 MB respectively. The workaround for this limitation is a hybrid approach of storing a binary resource’s metadata in DynamoDB and using S3's get/putPreSignedUrl APIs. So in your requests to the FHIR API, you will store/get the Binary's metadata from DynamoDB and in the response object it will also contain a pre-signed S3 URL, which should be used to interact directly with the binary file.

Testing binary resources

Using Postman

To test, use Postman. For steps, click here.

Note: We recommend you to test binary resources by using the Binary folder in Postman.

Using cURL

To test this with cURL, follow these steps:

  1. POST a binary resource to FHIR API using the following command:
curl -H "Accept: application/json" -H "Authorization: Bearer <COGNITO_AUTH_TOKEN>" -H "x-api-key:<API_KEY>" --request POST \
  --data '{"resourceType": "Binary", "contentType": "image/jpeg"}' \
  <API_URL>/Binary
  1. Check the POST's response. There will be a presignedPutUrl parameter. Use that pre-signed url to upload your file. See below for command
curl -v -T "<LOCATION_OF_FILE_TO_UPLOAD>" "<PRESIGNED_PUT_URL>"

Testing bulk data export

Bulk Export allows you to export all of your data from DDB to S3. We currently support the System Level export. For more information about bulk export, refer to the FHIR Implementation Guide.

To test this feature on FHIR Works on AWS, make API requests using the Fhir.postman_collection.json file by following these steps:

  1. In the FHIR Examples collection, under the Export folder, use GET System Export request to initiate an export request.
  2. In the response, check the Content-Location header field for a URL. The URL should be in the <base-url>/$export/<jobId> format.
  3. To get the status of the export job, in the Export folder, use the GET System Job Status request. Enter the jobId value from step 2 in that request.
  4. Check the response that is returned from GET System Job Status. If the job is in progress, the response header will have the field x-progress: in-progress. Keep polling that URL every 10 seconds until the job is complete. Once the job is complete, you'll get a JSON body with presigned S3 URLs of your exported data. You can download the exported data using those URLs. Example:
{
    "transactionTime": "2021-03-29T16:49:00.819Z",
    "request": "https://xyz.execute-api.us-west-2.amazonaws.com/$export?_outputFormat=ndjson&_since=1800-01-01T00%3A00%3A00.000Z&_type=Patient",
    "requiresAccessToken": false,
    "output":
    [
        {
            "type": "Patient",
            "url": "https://fhir-service-dev-bulkexportresultsbucket-.com/abc"
        }
    ],
    "error": []
}

Note: To cancel an export job, use the Cancel Export Job request in the "Export" folder located in the Postman collections.

Troubleshooting FHIR Works on AWS

  • If changes are required for the Elasticsearch instances, you may have to redeploy. Redeployment deletes the Elasticsearch cluster and creates a new one. Redeployment also deletes the data inside your cluster. In future releases, we will create a one-off lambda instance that can retrieve the data from DynamoDB to Elasticsearch. To do this, you can currently use either of the following options:

    • You can manually push the DynamoDB data to Elasticsearch by creating a lambda instance.
    • You can refresh your DynamoDB table with a backup.
    • You can remove all data from the DynamoDB table and that will create parity between Elasticsearch and DynamoDB.
  • Support for STU3 and R4 releases of FHIR is based on the JSON schema provided by HL7. The schema for R4 is more restrictive than the schema for STU3. The STU3 schema doesn’t restrict appending additional fields into the POST/PUT requests of a resource, whereas the R4 schema has a strict definition of what is permitted in the request. You can access the schema here.

Note: We are using the official schema provided by HL7.

  • When making a POST/PUT request to the server, if you get an error that includes the text Failed to parse request body as JSON resource, check that you've set the request headers correctly. The header for Content-Type should be either application/json or application/fhir+json. If you're using Postman for making requests, in the Body tab, make sure to change the setting to raw and JSON. Postman Body Request Settings

Feedback

We'd love to hear from you! Please reach out to our team via Github Issues for any feedback.

fhir-works-on-aws-deployment's People

Contributors

ahl27 avatar allanhodkinson avatar amazon-auto avatar arthuston avatar awsbakha avatar awsdrbalaji avatar bingjiling avatar brandroid-tw avatar carvantes avatar damiandmn avatar dependabot[bot] avatar jn1119 avatar joekendal avatar kcadette avatar mjkubba avatar nabellaleen avatar nguyen102 avatar nisankep avatar rb2010 avatar rsmayda avatar sanketd92 avatar sevu1 avatar shyogesh-sw avatar ssvegaraju avatar swoldemi avatar techiemac avatar wsc avatar zambonilli avatar zeubs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fhir-works-on-aws-deployment's Issues

Docker install instructions error

Receiving errors when I try to run the first Docker command in the instructions for installing via Docker:
docker build -t fhir-server-install -f docker/Dockerfile .

The tail of the log:

#5 41.88 E: Failed to fetch http://security.debian.org/debian-security/pool/updates/main/p/python3.5/libpython3.5-stdlib_3.5.3-1+deb9u3_amd64.deb 400 Bad Request
#5 41.88 E: Failed to fetch http://security.debian.org/debian-security/pool/updates/main/p/python3.5/libpython3.5-minimal_3.5.3-1+deb9u3_amd64.deb 400 Bad Request
#5 41.88 E: Failed to fetch http://security.debian.org/debian-security/pool/updates/main/b/bind9/libdns162_9.10.3.dfsg.P4-12.3+deb9u7_amd64.deb 400 Bad Request
#5 41.88 E: Failed to fetch http://security.debian.org/debian-security/pool/updates/main/b/bind9/libisccfg140_9.10.3.dfsg.P4-12.3+deb9u7_amd64.deb 400 Bad Request
#5 41.88 E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

executor failed running [/bin/sh -c apt-get update && apt-get install -yq python3-pip less dnsutils && pip3 install boto3 && curl -fsSL --compressed "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o /tmp/awscliv2.zip && unzip -q /tmp/awscliv2.zip -d /tmp && /tmp/aws/install && npm install serverless -g]: exit code: 100

I tried to add the --fix-missing suggestion and outcome was the same.

Narrowed it down to the less dnsutils portion of the command - if I remove that, the install script succeeds initially but the follow-up Docker command fails (still investigating why that is happening).

I thought I'd post this here as so far it has been a barrier for me using fhir-works-on-aws to create a proof of concept for my organization. If this could be resolved, I'm sure it would help others in the future.

Data of the wrong type can be registered. It can't be searched.

I believe that registering data of the wrong type should result in an error in the check during registration. And if we allow the registration of data of the wrong type, then we should be able to retrieve it in the GET resource as well. Am I wrong in my thinking?

Detail

I first tried to register the following AllergyIntolerance And it was successful.

POST {{API URL}}/AllergyIntolerance

{
  "resourceType": "AllergyIntolerance",
  "patient": {
    "reference": "{{API URL}}/Patient/{{Patient ID}}"
  },
  "code": {
    "coding": [
      "code1"
    ]
  }
}

However, I was not able to get it in the Get All Resource Data. There were zero results.

GET {{API URL}}/AllergyIntolerance

I'm able to retrieve the data by directly referring to the DynamoDB data and performing a search conditional on the id.

GET {{API URL}}/AllergyIntolerance/{{id}}

I noticed there that code.coding was registered as a String type, not a Coding type. I then re-registered the correct data.

POST {{API URL}}/AllergyIntolerance

{
  "resourceType": "AllergyIntolerance",
  "patient": {
    "reference": "{{API URL}}/Patient/{{Patient ID}}"
  },
  "code": {
    "coding": [
      {
        "display": "code2"
      }
    ]
  }
}

At this time, when we fetched the resource, one was returned (the one we registered the second time, of course).

GET {{API URL}}/AllergyIntolerance

Docker installation is not working on Fedora 32

To make it work, I had to add --network=host to the build command. Without it, docker is not able to reach debian servers for the apt-get commands

docker build -t fhir-server-install --network=host -f docker/Dockerfile .

Project timeline

Why do you keep releasing new versions of this repository / is there a checkbox of features you plan to add in future versions that we should know about? What is incomplete / what is missing?

Question - Allow multiple values for search parameters in a GET request

We want to support for allowing multiple search values for a couple of search parameters such as Patient.Identifiers and Patient.Name
As part of FHIR specs(https://www.hl7.org/fhir/search.html#composite), single parameter with multiple values must be separated by a comma.
How to distinguish between the values that might have a comma in them?
For Example: name in (user1, user2) versus name in ("usersLastName ,user1", user2 ). Should we use an escape character for the comma in the search value?

Thanks!
Shruti

Search based on identifier.system field on Patient api is not working

I tried to search for a patient by specifying the identifier.system in the Patient resource, but when I specify the system, it also returns unrelated patients.

Request and Expected and Actual

The Expected and Actual is show the total value of the response (the number of patients that matched the condition).

No. Request Expected Actual Result
1 GET {{API_URL}}/Patient?identifier=http://www.example.com| 2 4 NG
2 GET {{API_URL}}/Patient?identifier=http://www.example.com|test1 1 4 NG
3 GET {{API_URL}}/Patient?identifier=test1 2 2 OK
4 GET {{API_URL}}/Patient?identifier=test2 1 1 OK

Registered patients

Registered patients

Patient1:

{
"resourceType": "Patient",
"identifier": [
{
"use": "official",
"system": "http://example.com",
"value": "test1"
}
],
"name": [
{
"given": ["test1"],
"family": "Tester"
}
]
}

Patient2:

{
"resourceType": "Patient",
"identifier": [
{
"use": "official",
"system": "http://example.com",
"value": "test2"
}
],
"name": [
{
"given": ["test2"],
"family": "Tester"
}
]
}

Patient3:

{
"resourceType": "Patient",
"identifier": [
{
"use": "official",
"system": "http://www.example.com",
"value": "test1"
}
],
"name": [
{
"given": ["test3"],
"family": "Tester"
}
]
}

Patient4:

{
"resourceType": "Patient",
"identifier": [
{
"use": "official",
"system": "http://www.example.com",
"value": "test4"
}
],
"name": [
{
"given": ["test4"],
"family": "Tester"
}
]
}

[Feature Request] Make getting new access_token easier from POSTMAN

I am having issues using Postman to make my first call to FHIR Works on AWS. Per https://github.com/awslabs/fhir-works-on-aws-deployment#retrieving-access-token-via-postman-scope--openid-profile and specifically in the section called Authorizing a User, I am use the Get New Token feature. Please note I am using the Postman collection from this project.

For this feature, Postman opens up a dialog box which I have done my best to fill out.

There is no mention of a Grant Type, so I have assumed Password Credentials since we are trying to access this by username and password.

My first issue is if Token Name is supposed to specially be called anything.

My username and password is from the setup in cognito when installed using cloud formation for FHIR Works on AWS.

Bottom line is that I have not been able to gain authorization using the directions provided. The URL endpoints all look correct and came from other documentation such as the implementation guide.

HTTP Delete request does not work

I tried to delete my recourse via below code but it returns me an error that url not found.

String pt_url0 = "BASEURL/dev/Patient?identifier=1234";
URL url0 = new URL(pt_url0);
HttpURLConnection connection0 = (HttpURLConnection) url0.openConnection();
connection0.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection0.setRequestProperty("Authorization", cognitoAuthToken);
connection0.setRequestProperty("x-api-key", API_KEY);
connection0.setRequestMethod("DELETE");
connection0.connect();
System.out.println(connection0.getResponseCode());

Error during win_install.ps1 execution - Lambda function is too large

I am trying to use FHIRWorks with Windows Install. when I run scripts/win_install.ps1, I get the InvalidParameterValueException.

I checked #184 and #166 before writing this issue. npm prune and npm dedupe were also tried, but they did not solve the problem.

I was not able to try the following commands because there was no awk command in my environment.
sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g

Run commands

npm prune
npm dedupe
.\scripts\win_install.ps1 -Region us-east-2 -Stage dev

Error ditails

  Serverless Error ---------------------------------------

  An error occurred: UpdateStatusLambdaFunction - Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: eb10a477-29a7-4162-bab4-3d9a498564b9; Proxy: null).

Environment Information

  Your Environment Information ---------------------------
     Operating System:          win32
     Node Version:              14.4.0
     Framework Version:         1.83.2 (standalone)
     Plugin Version:            3.8.4
     SDK Version:               2.3.2
     Components Version:        2.34.9

Note

I got error #233 when I ran win_install.ps1, but this was not an error that could not be continued. For this reason, I ignored the #233 error and continue the program, which confirmed this error. I don't think this is relevant, but just in case, I'll mention it.

Lambda too big; Initial deployment failing on UploadGlueScriptsLambdaFunction

I'm trying to get an initial setup deployed in my account, but it keeps failing on this step. I'm deploying from the mainline branch with no edits.

Logical ID in the CloudFormation stack is UploadGlueScriptsLambdaFunction.

The Status Reason is:
Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: 5e143636-d418-4fc8-a031-3d3128a4f6c0; Proxy: null)

Screen Shot 2021-01-13 at 8 57 13 PM

Edit: To clarify, this was deploying via macOS with the sudo ./scripts/install.sh command. I was able to get it working using the docker install.

Search for multiple identifiers

Hi,

In our system we will have patient data coming from multiple different systems. We can try to manage this through the managingOrganization attribute, but we also would like to be able to search for multiple identifiers. I've tried sending a comma separated list and it didn't work. Also tried "php style" array (?identifier[]=...&identififier[]=...) which ended up causing a 500 error.

Since in our case patients get multiple identifiers as the source of the data may be different EPR systems, we want the patient to be able to see his data only refering that EPR system instance, so, we would save 3 identifiers: NHS number, our internal Patient UUID and the remote system UUID. We need this multiple search as we need to make all different combinations for searching patients data and prevent crossing between different systems.

How is the search for multiple identifiers supposed to be done?

[Feature Request] Capabilities defined by the `persistence` package

Hi AWS team,
Are you looking at the possibility of deriving the fields that go into the FHIRConfig router definition automatically from the server ".capabilities" method?
The FWoA router provides the "/metadata" route which builds a CapabilityStatement from the server config but there is scope for having a mismatch between what is set in the FHIRConfig and what the server describes in its ".capabilities" method response.

I see that there is some use of resource.typeSearch.getCapabilities() method so wondering if this is something you will take further?
Many thanks,
Allan

aws-sdk dependency

Hi,
Not sure if this has already been covered but in this component (and also the dynamo & search-es components) there is a dependency on the aws-sdk npm package. Is this removed during the serverless build process or will it be in the zip file that is deployed? I'm wondering what impact this makes on the zip package size?
I think this becomes less of an issue when the V3 sdk is rolled out for FHIRWorks.
Thanks,
Allan

[Feature Request] Patient $merge process

Hello All, Is there any plans for implementing patient Merge process.

https://www.hl7.org/fhir/patient.html#merge

Patient Merge/split is one of the frequently happening issue with HealthCare.

  • John Smith’s record is created in the system with IOI id 12345 and Patient records get added in FHIR server with FHIR Patient “Resource id” as “abd5t-kiun4-u4li-d3rc”. Questions : Whether the same IOI “12345” is updated in member profile of identity provider for data access enablement via 3rd Party App?

  • Later point of time, some source system sends the John Smith records and a new IOI 67891 is created due to some mismatch in demographic. A new FHIR Patient resource is being added in FHIR Server with FHIR Patient Resource id “kjkjl-iui34-qx3kx-apo98” and associated records are referenced to new FHIR Patient Resource id and updated in FHIR server.

  • System (ETL process) identified that both 12345 and 67891 belongs to same patient and de-duplicate 6789. All the systems are updated to reflect 12345 instead of 67891 except FHIR Server. We would require strategy / process to de-link all the resources from resource id “kjkjl-iui34-qx3kx-apo98” and link to “abd5t-kiun4-u4li-d3rc” and remove the Patient resource with resource id “kjkjl-iui34-qx3kx-apo98”.

Support Multi-tenancy

Add support for multi-tenancy for a more economic Saas offering without affecting the existing non-tenant based approach.

Initial design proposal:

  • API Gateway will be enhanced to pass tenant-id as part of URL - https://fhir.server.com/tenant/{tenant-id}/{resource}

  • API Gateway - extract tenant-id and pass it as parameter

  • Lambda write into tenant based table - resource-db-dev-1-tenant-id

  • DynamoDB - streaming pass this data to ElasticSearch

  • Separate - index per tenant/resource OR - global resource index

  • Meta-data/conformance page need to incorporate tenant-id based approach

  • lack of a tenant id would use the existing non-tenant design

Open design items:

  • Tenant S3 bucket binary storage

  • Finalize ES design decision

DEV_FHIR_API_ENDPOINT value post successful installation

As per console logs, seems like, Fhir deployment has been successful -

Please suggest where and at which port FHIR server will be running? I need this info to test with Postman and also to test the APIs.
Normally, every service prints the url in the last

{
"enabled": true,
"key": "API_URL",
"value": "<DEV_FHIR_API_ENDPOINT>",
"type": "text"
},
{
"enabled": true,
"key": "API_KEY",
"value": "<DEV_API_KEY>",
"type": "text"
},
{
"enabled": true,
"key": "COGNITO_TOKEN",
"value": "<COGNITO_AUTH_TOKEN>",
"type": "text"
}

#########
You can also set up the server to archive logs older than 7 days into S3 and delete those logs from Cloudwatch Logs.
You can also do this later manually, if you would prefer.

Would you like to set the server to archive logs older than 7 days? (yes/no): no

Would you like to set up daily DynamoDB Table backups?

Selecting 'yes' below will set up backups using the default setup from the cloudformation/backups.yaml file.
DynamoDB Table backups can also be set up later. See the README file for more information.

Note: This will deploy an additional stack, and can lead to increased costs to run this server.

Would you like to set up backups now? (yes/no): no

Setup completed successfully.
You can now access the FHIR APIs directly or through a service like POSTMAN.

For more information on setting up POSTMAN, please see the README file.
All user details were stored in 'Info_Output.yml'.

You can obtain new Cognito authorization tokens by using the init-auth.py script.

Syntax:
python3 init-auth.py <USER_POOL_APP_CLIENT_ID>

For the current User:
python3 init-auth.py us-east-1

Fhir support for RedShift

We use AWS RedShift as data warehouse and would like to use current infrastructure behind fhir lambda..

Please suggest if any RedShift connector or blueprints for fhir exist?

Add support for visual studio code remote containers

For development I really like using visual studio code with the remote containers extension. This gives you the same benefits of your docker installation path but cleanly integrates with visual studio code. You can see an example of how I used this for another project here:

https://github.com/chafey/dumbo-drop

I would be happy to submit a PR if this is of interest - please let me know!

list of supported resources

I can see the working example of Patient resources.
Where i can see the list of supported resourceType like Encounter, Observation etc?

Please suggests if these are the supported resourceType?

Errors running install

On Linux Ubuntu 20.10, dist-updated last 12/04/21 after all dependencies were solved (minor problem between node-js and node-doc manually solved by running

# apt install -y libnode72 nodejs-doc
# apt remove  nodejs-doc
# apt install -y nodejs

I've ended up with 3 errors

Done!
00h00m00s 0/0: : ERROR: [Errno 2] No such file or directory: 'install'
00h00m00s 0/0: : ERROR: [Errno 2] No such file or directory: 'run'

and

Serverless plugin "serverless-step-functions" not found. Make sure it's installed and listed in the "plugins" section of your serverless config file.

image

All versions I could think of are in the screenshots.

Let me know if you need more information from us.

Info_Output.yml is empty

Hi,

I'm on Linux Fedora 32.

I've launched the ./scripts/install.sh, let it install the dependencies.
No ACCESS TOKEN was output, because Cognito wal already initialized. (which seems not true : there is nothing setup in Cognito while looking via the console)

I've let the CLI create a Cognito user, and the tool said :

Parameter validation failed:
Invalid length for parameter ClientId, value: 0, valid range: 1-inf

Then I've answered no to the question about logs and backup.

And at the end, the Info_Output.yml file is empty, so I don't have any information about the running instance.

Note : at the end of the logs, the command lien says :

Syntax: 
python3 scripts/init-auth.py <USER_POOL_APP_CLIENT_ID> <REGION>

For the current User:
python3 scripts/init-auth.py  eu-west-3

So it seems there is no USER_POOL_APP_CLIENT_ID configured

Any support for Synthea?

I am trying to populate some synthetic patients using Synthea (https://github.com/synthetichealth/synthea).

For records that have references getting an error like this...

This entry's reference is not recognized. Entry's reference is: Practitioner?identifier=http://hl7.org/fhir/sid/us-npi|9999999459 . Valid format includes <url>/resourceType/id or <urn:uuid:|urn:oid:><id>

Curious if this may be a bug with the validation in FWoA or potential issue with the ID's Synthea is generating?

Adding other FHIR Resources and DSTU2

The tutorial implemented the Patient and Binary resources. How would we go about adding the remaining resources? How would we go about adding the DSTU2 capability?

"message": "Internal server error" for POST {{API_URL}}/Binary endpoint

When sending jpeg file, getting below error -
POST {{API_URL}}/Binary
{
"message": "Internal server error"
}

Screen Shot 2020-09-21 at 6 37 54 PM

When not sending binary file, getting below error -

{
"resourceType": "OperationOutcome",
"text": {
"status": "generated",
"div": "<div xmlns="http://www.w3.org/1999/xhtml\">

Operation Outcome

<table border="0"><td style="font-weight: bold;">ERROR[]
Failed to parse request body as JSON resource. Error was: data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should have required property 'resourceType'
"
},
"issue": [
{
"severity": "error",
"code": "processing",
"diagnostics": "Failed to parse request body as JSON resource. Error was: data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should NOT have additional properties, data should have required property 'resourceType'"
}
]
}

'ResourceNotFoundError' when updating a Resource

Good afternoon

We noticed that when updating a resource with a document status of 'AVAILABLE' and vid of 10 we were receiving a 'ResourceNotFoundError' error. The latest 2 versions of the resource should be returned from the 'getMostRecentValidResource' query, but we were actually getting versions 8 & 9 back, which were both set to 'DELETED'. The problem appears to be related to the vid, which is defined as a string in ddb and therefore affects the sort order, as a string of '10' is less than '8' & '9'. I did think about updating the vid to be a number in ddb, but the vid is passed in as a string parameter.

I just wanted to check if this was a real issue or if I was doing something wrong?

Kind regards

Steve

Archiving Support

I have privacy requirements that some of a patient's online data is archived offline after 6 months for a period of 10 years. Specifically, the AuditEvent resource where the entity is a patient. Looking through the code, I think there's 2 paths that make sense but want to double check that I'm not missing a better way to implement archiving. Ideally, I'll be doing a PR from my fork here as well.

  1. Create an AWS Glue job similar to the bulk export job where the input is the resource-db-$stage dynamoDB table and it filters the dataframe based on some configurable archiving rules. From there, the job would write the results to an s3 bucket that could have configurable lifecycle rules for cost optimization. There would also need to be logic here somehow to delete data from the Elastic Search indexes as well. Not sure if we could refactor the current dynamoDB change data capture logic for ES to be pubsub so we can have multiple producers.
  2. Add a dynamoDB TTL field to the resource-db-$stage table and logic in the persistence-ddb to set the TTL field for configurable resourceTypes and periods. Then use kinesis firehose to listen for system deletes on the dynamodb change data capture stream. This feels cleaner and would have better code reuse but makes the storage abstraction requirements higher and a bit more coupled to DynamoDb.

Another wrinkle is that I will need to implement GDPR/CCPA delete and export in the archives themselves later. It feels like another db table here that maps patient uuid to a set of archive files makes sense. Otherwise, using Glue/Athena's ability to select $path from archives where uuid=patientId would work at smaller scales.

Am I missing another option here that makes sense and would be a bit easier to implement?

ResourceNotFoundException

Having followed the steps in DEVELOPMENT.md, when running serverless offline and trying a POST request, I am greeted with the following exception:

ResourceNotFoundException: Requested resource not found
    at Request.extractError (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/protocol/json.js:52:27)
    at Request.callListeners (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:690:12)
    at Request.callListeners (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:690:12)
    at Request.callListeners (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at callNextListener (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
    at IncomingMessage.onEnd (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/event_listeners.js:313:13)
    at IncomingMessage.emit (node:events:388:22)
    at IncomingMessage.EventEmitter.emit (node:domain:470:12)
    at endReadableNT (node:internal/streams/readable:1295:12)
    at processTicksAndRejections (node:internal/process/task_queues:80:21) {
  code: 'ResourceNotFoundException',
  time: 2021-02-20T21:56:49.652Z,
  requestId: 'M172QB2R4NG010Q0BAQCNV7RUJVV4KQNSO5AEMVJF66Q9ASUAAJG',
  statusCode: 400,
  retryable: false,
  retryDelay: 0.6577762230455808
}
Unhandled Error ResourceNotFoundException: Requested resource not found
    at Request.extractError (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/protocol/json.js:52:27)
    at Request.callListeners (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:690:12)
    at Request.callListeners (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/request.js:690:12)
    at Request.callListeners (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at callNextListener (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
    at IncomingMessage.onEnd (/Users/joe/Dev/fhir-works/fhir-works-on-aws-persistence-ddb/node_modules/aws-sdk/lib/event_listeners.js:313:13)
    at IncomingMessage.emit (node:events:388:22)
    at IncomingMessage.EventEmitter.emit (node:domain:470:12)
    at endReadableNT (node:internal/streams/readable:1295:12)
    at processTicksAndRejections (node:internal/process/task_queues:80:21) {
  code: 'ResourceNotFoundException',
  time: 2021-02-20T21:56:49.652Z,
  requestId: 'M172QB2R4NG010Q0BAQCNV7RUJVV4KQNSO5AEMVJF66Q9ASUAAJG',
  statusCode: 400,
  retryable: false,
  retryDelay: 0.6577762230455808
}

These packages are definitely installed...

AWS Solution Implementation: Search based on active field on patient api is not working

Search based on active field on patient api is not working and it is returning zero results even though active data are available.

Create Patient Request

POST {{API_URL}}/Patient

{
  "resourceType": "Patient",
  "active": true,
  "name": [
    {
      "use": "official",
      "family": "442",
      "given": [
        "Rye"
      ]
    }
  ]
}

Request

GET {{API_URL}}/Patient?active=true

Results Body

{
  "resourceType": "Bundle",
  "id": "b6dd7abc-fe1f-405b-a603-a421470c810b",
  "meta": {
    "lastUpdated": "2021-03-01T05:22:58.206Z"
  },
  "type": "searchset",
  "total": 0,
  "link": [
    {
      "relation": "self",
      "url": "{{API_URL}}/Patient?active=true"
    }
  ],
  "entry": []
}

Note

I am following FHIR Works on AWS Implemation Guide and using CloudFormation to launch and use the template on the following URL.

https://s3.amazonaws.com/solutions-reference/fhir-works-on-aws/latest/fhir-works-on-aws.template

Edit log

2021/3/3 - Added description of Request Body.

Initial deployment failing on Serverless: Copying Dependencies ...

I'm trying to deploy for the first time into my account, but it keeps failing on this step "Serverless: Copying Dependencies" with this error "EISDIR: illegal operation on a directory, symlink". I'm deploying from the mainline branch with no edits.

Installing dependencies...

The following dependencies will need to be installed:

None! All dependencies already satisfied
We just need to double-check that the boto3 python module is installed...
Requirement already satisfied: boto3 in c:\python39\lib\site-packages (1.16.59)
Requirement already satisfied: s3transfer<0.4.0,>=0.3.0 in c:\python39\lib\site-packages (from boto3) (0.3.4)
Requirement already satisfied: botocore<1.20.0,>=1.19.59 in c:\python39\lib\site-packages (from boto3) (1.19.59)
Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in c:\python39\lib\site-packages (from boto3) (0.10.0)
Requirement already satisfied: urllib3<1.27,>=1.25.4; python_version != "3.4" in c:\python39\lib\site-packages (from botocore<1.20.0,>=1.19.59->boto3) (1.26.2)
Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in c:\python39\lib\site-packages (from botocore<1.20.0,>=1.19.59->boto3) (2.8.1)
Requirement already satisfied: six>=1.5 in c:\python39\lib\site-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.20.0,>=1.19.59->boto3) (1.15.0)
WARNING: You are using pip version 20.2.3; however, version 21.0 is available.
You should consider upgrading via the 'C:\Python39\python.exe -m pip install --upgrade pip' command.
yarn install v1.22.5
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/5] Validating package.json...
[2/5] Resolving packages...
warning Resolution field "[email protected]" is incompatible with requested version "[email protected]"
[3/5] Fetching packages...
info [email protected]: The platform "win32" is incompatible with this module.
info "[email protected]" is an optional dependency and failed compatibility check. Excluding it from installation.
[4/5] Linking dependencies...
warning " > [email protected]" has incorrect peer dependency "jest@^24.0.0".
warning "serverless > @serverless/components > [email protected]" has unmet peer dependency "inquirer@^5.0.0 || ^6.0.0 || ^7.0.0".
[5/5] Building fresh packages...
[1/4] ⢀ snappy                                                                                                                                                                                                                      [-/4] ⢀ waiting...                                                                                                                                                                                                                  [-/4] ⠠ waiting...                                                                                                                                                                                                                  warning Error running install script for optional dependency: "D:\\AWS\\fhir-works-on-aws-deployment-mainline\\node_modules\\snappy: Command failed.
Exit code: 1
Command: prebuild-install || node-gyp rebuild
Arguments:
Directory: D:\\AWS\\fhir-works-on-aws-deployment-mainline\\node_modules\\snappy
Output:
prebuild-install WARN install No prebuilt binaries found (target=15.6.0 runtime=node arch=x64 libc= platform=win32)

D:\\AWS\\fhir-works-on-aws-deployment-mainline\\node_modules\\snappy>if not defined npm_config_node_gyp (node \"C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\node-gyp-bin\\\\..\\..\\node_modules\\node-gyp\\bin\\node-gyp.js\" rebuild )  else (node \"\" rebuild )
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | win32 | x64
gyp info find Python using Python version 3.9.1 found at \"C:\\Python39\\python.exe\"
gyp ERR! find VS
gyp ERR! find VS msvs_version not set from command line or npm config
gyp ERR! find VS VCINSTALLDIR not set, not running in VS Command Prompt
gyp ERR! find VS checking VS2019 (16.8.30711.63) found at:
gyp ERR! find VS \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\"
gyp ERR! find VS - \"Visual Studio C++ core features\" missing
gyp ERR! find VS checking VS2017 (15.9.28307.718) found at:
gyp ERR! find VS \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\"
gyp ERR! find VS - \"Visual Studio C++ core features\" missing
gyp ERR! find VS could not find a version of Visual Studio 2017 or newer to use
gyp ERR! find VS looking for Visual Studio 2015
gyp ERR! find VS - not found
gyp ERR! find VS not looking for VS2013 as it is only supported up to Node.js 8
gyp ERR! find VS
gyp ERR! find VS **************************************************************
gyp ERR! find VS You need to install the latest version of Visual Studio
gyp ERR! find VS including the \"Desktop development with C++\" workload.
gyp ERR! find VS For more information consult the documentation at:
gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windows
gyp ERR! find VS **************************************************************
gyp ERR! find VS
gyp ERR! configure error
gyp ERR! stack Error: Could not find any Visual Studio installation to use
gyp ERR! stack     at VisualStudioFinder.fail (C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\lib\\find-visualstudio.js:121:47)
gyp ERR! stack     at C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\lib\\find-visualstudio.js:74:16
gyp ERR! stack     at VisualStudioFinder.findVisualStudio2013 (C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\lib\\find-visualstudio.js:351:14)
gyp ERR! stack     at C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\lib\\find-visualstudio.js:70:14
gyp ERR! stack     at C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\lib\\find-visualstudio.js:372:16
gyp ERR! stack     at C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\lib\\util.js:54:7
gyp ERR! stack     at C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\lib\\util.js:33:16
gyp ERR! stack     at ChildProcess.exithandler (node:child_process:340:5)
gyp ERR! stack     at ChildProcess.emit (node:events:379:20)
gyp ERR! stack     at maybeClose (node:internal/child_process:1065:16)
gyp ERR! System Windows_NT 10.0.18363
gyp ERR! command \"C:\\\\Program Files\\\\nodejs\\\\node.exe\" \"C:\\\\Program Files\\\\nodejs\\\\node_modules\\\\npm\\\\node_modules\\\\node-gyp\\\\bin\\\\node-gyp.js\" \"rebuild\"
gyp ERR! cwd D:\\AWS\\fhir-works-on-aws-deployment-mainline\\node_modules\\snappy
gyp ERR! node -v v15.6.0
success Saved lockfile.
Done in 317.02s.
yarn run v1.22.5
$ tsc
Done in 58.88s.
yarn run v1.22.5
$ jest --silent --passWithNoTests --testPathPattern=src/*
No tests found, exiting with code 0
Done in 21.11s.


Deploying FHIR Server
(This may take some time, usually ~20-30 minutes)


Serverless: Running "serverless" installed locally (in service node_modules)
Serverless: Deprecation warning: Starting with next major version, default value of provider.lambdaHashingVersion will be equal to "20201221"
            More Info: https://www.serverless.com/framework/docs/deprecations/#LAMBDA_HASHING_VERSION_V2
Serverless: Deprecation warning: Starting with next major version, API Gateway naming will be changed from "{stage}-{service}" to "{service}-{stage}".
            Set "provider.apiGateway.shouldStartNameWithService" to "true" to adapt to the new behavior now.
            More Info: https://www.serverless.com/framework/docs/deprecations/#AWS_API_GATEWAY_NAME_STARTING_WITH_SERVICE
Serverless: Deprecation warning: Starting with next major version, API Gateway-specific configuration keys "apiKeys", "resourcePolicy" and "usagePlan" will be relocated from "provider" to "provider.apiGateway"
            More Info: https://www.serverless.com/framework/docs/deprecations/#AWS_API_GATEWAY_SPECIFIC_KEYS
Serverless: Compiling with Typescript...
Serverless: Using local tsconfig.json at "D:\AWS\fhir-works-on-aws-deployment-mainline\tsconfig.json"
Serverless: TypeScript compiled.
Serverless: Copying Extras...
Serverless: Finished Copying Extras
Serverless: Copying Dependencies ...

  Error --------------------------------------------------

  Error: EISDIR: illegal operation on a directory, symlink 'D:\AWS\fhir-works-on-aws-deployment-mainline\package.json' -> 'D:\AWS\fhir-works-on-aws-deployment-mainline\.build\package.json'

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information ---------------------------
     Operating System:          win32
     Node Version:              14.4.0
     Framework Version:         2.20.1 (standalone)
     Plugin Version:            4.4.2
     SDK Version:               2.3.2
     Components Version:        3.5.1

RE: Security Errors and Deprecation Warnings in latest branches

Hey guys,

Looking to get this up and running at my company. When I clone the latest and checkout any of these branches [Mainline, Aws Solution, Develop] and run npm install, I get a ton of deprecation warnings and severe security issues warnings. There is no way my compliance department will buy off on that.

Any advice or fixes?

Thanks!

Here is a paste of some of the warnings/errors:

PS C:\Development\FHIR\aws\fhir-works-on-aws-deployment> npm install
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: Switch to 'npm install joi'
npm WARN deprecated @hapi/[email protected]: This version contains severe security issues and defects and should not be used! Please upgrade to the latest version of @hapi/hapi or consider a commercial license (hapijs/hapi#4114)
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: Switch to 'npm install joi'
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: Moved to 'npm install @sideway/address'
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: Moved to 'npm install @sideway/pinpoint'
npm WARN deprecated @hapi/[email protected]: Moved to 'npm install @sideway/formula'
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated [email protected]: Critical security vulnerability fixed in v0.21.1. For more information, see axios/axios#3410
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated [email protected]: request-promise-native has been deprecated because it extends the now deprecated request package, see request/request#3142
npm WARN deprecated [email protected]: request has been deprecated, see request/request#3142
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @types/[email protected]: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed!
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^2.1.2 (node_modules\jest-haste-map\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
npm WARN [email protected] requires a peer of ts-node@>=9.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of canvas@^2.5.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself.
npm WARN The package axios is included as both a dev and production dependency.

Cognito App Client is not created with a secret

After running install I've noticed the Cognito App Client has no Secret to it. Please, add secret on this for better security, as this would require us to hash the secret and then hash it with the client to get the correct SecretHash/SECRET_HASH value for the Cognito API

win_install.ps1 will raise an error stating that the 'StackName' parameter is not specified

I'm currently trying a Windows installation of FHIRWorks using this page as a reference.

scripts/win_install.ps1 will raise an error stating that the 'StackName' parameter is not specified.

Is this the intended behavior?

Run command

.\scripts\win_install.ps1 -Region us-east-2 -Stage dev

error details

Get-CFNStack : パラメーター 'StackName' の引数が指定されていません。型 'System.String' のパラメーターを指定し、再試行し
てください。
発生場所 C:\fhir\fhir-works-on-aws-deployment\scripts\win_install.ps1:216 文字:28
+     $redep = (Get-CFNStack -StackName -Region $region fhir-service-$s ...
+                            ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-CFNStack]、ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,Amazon.PowerShell.Cmdlets.CFN.GetCFNStackCmdlet

sort based on lastUpdated

Hi,
I have 3 entries with same name (ABC) and i want to sort them based on the lastUpdated and get the last one so i did:

String pt_url2 = " https://uwiv2v70ia.execute-api.us-west-2.amazonaws.com/dev/Patient?name=ABC&_sort=-lastUpdated&_count=1";
URL url3 = new URL(pt_url2);//.openConnection();
HttpURLConnection connection2 = (HttpURLConnection) url3.openConnection();
connection2.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection2.setRequestProperty("Authorization", cognitoAuthToken);
connection2.setRequestProperty("x-api-key", API_KEY);
connection2.setRequestMethod("GET");
InputStream response2 = connection2.getInputStream();
try (Scanner scanner = new Scanner(response2)) {
String responseBody = scanner.useDelimiter("\A").next();
System.out.println(responseBody);

	}

but it returns me an empty entry. if i remove the _sort and _count then I will get all my three entries.

Working Bundle Example?

I am having problems getting a Bundle Transaction to work. Is there a good working example, from the API interface somewhere? I desperately need to get some data loaded. Some observations:

  • It would be incredibly nice to have a working Bundle example added to the Fhir.postman_collection.json in the Deployment project. Especially one that creates a new resource WITH a supplied ID for the resource. Especially, if I cannot do it any other way at the moment (It sounds like individual creates with an ID are in the backlog yet).
  • The openapi.yaml file in the Interface project documents a supposed "bundle\transaction" route:
    • This only returns a "Forbidden" error for me. Which can take you down a rabbit hole wondering why it was forbidden. It seems that the proper route is actually "Bundle\transaction" with an upper case "B" on "Bundle".
    • It reportedly accepts a request body type of "TransactionRequest". The schema definition for "TransactionRequest" embedded within the yaml does not seem to align with the class definitions found in the project.
    • The route is listed as only supporting a POST method. POST does align with FHIR 4.0.1 specs. So far, no matter what I do with a payload, I am only getting to tell me that it "Cannot POST /Bundle/transaction". Should I be able to POST to this route?
  • NOTE: I attempted a PUT, which I do not think I want, and I get a "Can not update resource with ID[transaction], while the given request payload has an ID[undefined]"

Searching by full TimeStamp; Observation date search is not working

There is my data in Observation record:
"effectiveDateTime": "2019-11-28T19:00:06Z",
When I make a search request such as:
/Observation?date=2019-11-28T19:00:06Z
It is not working.
Error:
{ "resourceType": "OperationOutcome", "text": { "status": "generated", "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><h1>Operation Outcome</h1><table border=\"0\"><tr><td style=\"font-weight: bold;\">error</td><td>[]</td><td><pre>Internal server error</pre></td></tr></table></div>" }, "issue": [ { "severity": "error", "code": "exception", "diagnostics": "Internal server error" } ] }

If I change to:
/Observation?date=2019-11-28
it returns:

{
    "resourceType": "Bundle",
    "id": "832febb9-ab25-4b5d-85cb-ba8448f23d76",
    "meta": {
        "lastUpdated": "2021-01-20T08:43:43.985Z"
    },
    "type": "searchset",
    "total": 0,
    "link": [
        {
            "relation": "self",
            "url": "https://<DOMAIN>.execute-api.<REGION>.amazonaws.com/dev/Observation?date=2019-11-28"
        }
    ],
    "entry": []
}

When I use yyyy-mm-dd format to search _lastUpdated, its work, but it seems not working with yyyy-mm-ddThh:mm:ss[Z|(+|-)hh:mm] format.

Please correct me if I was wrong somewhere.
Thanks in advance!!

Question - Custom resources meta.tag

Hi AWS Team,
Thanks for implementing FHIR Works.
I want to add custom meta.tag when I POST a resource.
I just saw meta.lastUpdated and meta.versionId automatically generated after registration.
Does FHIR Works support custom meta.tag (and meta.security)?
If already supported, please show me how to.

Thanks in advance for any help you are able to provide.

STU3 Json schema for Allergy intolerance and transactions results in Bad request error even with correct payload

  1. Allergy Intolerance: The Category attribute is an array of enum values. The Json structure as described, does not allow to include {“category”: [“food”]} in payload. Since enum is a property of items, it should be included in items filed.
    {
    "description": "Category of the identified substance.",
    { "type": "array", "enum": [ "food", "medication", "environment", "biologic" ], "items": { "type": "string" } }
  2. Bundle: Transaction requests for create and update interaction (POST and PUT methods: [Input])(http://hl7.org/fhir/stu3/bundle-transaction.json.html) fail with Bad request error for all resources due to a oneOf JSON property in the ResourceList. For Ex: While Posting a Patient resource using transactions, Error occurred due to a failed validation where the patient Resource in the bundle entry matches with Patient, DomainResource, Parameters and Resource schemas.

Deploy Local Packages to AWS -- missing node_modules dependencies.

Following the instruction under Deploy Local Packages to AWS and I ran into an issue where the packaged fhir-service.zip is missing dependencies.

cloudformation fails with the following error for the FhirServerProvConcLambdaAlias event

Provisioned Concurrency configuration failed to be applied. Reason: FUNCTION_ERROR_INIT_FAILURE

Example of an error in cloudwatch

2021-01-11T17:45:17.249Z	undefined	ERROR	Uncaught Exception 	
{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module 'qs'\nRequire stack:\n- /var/task/node_modules/express/lib/middleware/query.js\n- /var/task/node_modules/express/lib/application.js\n- /var/task/node_modules/express/lib/express.js\n- /var/task/node_modules/express/index.js\n- /var/task/node_modules/fhir-works-on-aws-routing/lib/app.js\n- /var/task/node_modules/fhir-works-on-aws-routing/lib/index.js\n- /var/task/src/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
    "stack": [
        "Runtime.ImportModuleError: Error: Cannot find module 'qs'",
        "Require stack:",
        "- /var/task/node_modules/express/lib/middleware/query.js",
        "- /var/task/node_modules/express/lib/application.js",
        "- /var/task/node_modules/express/lib/express.js",
        "- /var/task/node_modules/express/index.js",
        "- /var/task/node_modules/fhir-works-on-aws-routing/lib/app.js",
        "- /var/task/node_modules/fhir-works-on-aws-routing/lib/index.js",
        "- /var/task/src/index.js",
        "- /var/runtime/UserFunction.js",
        "- /var/runtime/index.js",
        "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
        "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
        "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
        "    at Module._compile (internal/modules/cjs/loader.js:1015:30)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10)",
        "    at Module.load (internal/modules/cjs/loader.js:879:32)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:724:14)",
        "    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)",
        "    at internal/main/run_main_module.js:17:47"
    ]
}

^ normally I see an error for the "methods" module missing. but I ran into this this error when trying to deploy with "methods" defined as a dependency in the fhir-works-on-aws-routing package.json.

Steps to reproduce:

  1. Clone the fhir-works projects into a directory
  2. Copy/Paste these two scripts from fhir-works-on-aws-deployment into same folder as the cloned projects
    fhir-works-deploy.sh
    fhir-works-deploy-one-time-setup.sh
  3. Run fhir-works-deploy-one-time-setup.sh
  4. Run fhir-works-deploy.sh
  5. cd into fhir-works-on-aws-deployment
  6. run sudo -E serverless deploy --stage=<stage> --region=<region>

You can get away with running serverless package instead of deploy. Under the .serverless directory you can see the "methods" and "qs" modules are missing from fire-servize.zip node_modules.

One interesting thing to mention is that simply cloning the fhir-works-on-aws-deployment, running yarn install, and then running serverless package/deploy appears to correctly package these dependencies.

Node version: v12.20.1
yarn version: 1.22.10
yalc version: 1.0.0-pre.47

Update:
I tried running serverless package but added the value package.excludeDevDependencies = false within serverless.yaml. The dependencies did show up in the fhir-service package after this. So I assume these are being removed sometime in the exclude dev dependency step of serverless package/deploy. Granted the fhir-service.zip package is too large to deploy after doing this, but atleast this might be helpful information while troubleshooting.

Error during install.sh execution - Lambda function is too large

Cloned from mainline and while following these steps below I ran into an error during serverless deploy:
https://github.com/awslabs/fhir-works-on-aws-deployment/blob/mainline/INSTALL.md#linux-or-osx-installation

Here is the error

Serverless Error ---------------------------------------

An error occurred: UpdateStatusLambdaFunction - Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: 3632f87a-4d09-45e7-8be8-5b5babd30a03; Proxy: null).

Get Support --------------------------------------------
Docs: docs.serverless.com
Bugs: github.com/serverless/serverless/issues
Issues: forum.serverless.com

Your Environment Information ---------------------------
Operating System: darwin
Node Version: 15.0.1
Framework Version: 2.12.0 (local)
Plugin Version: 4.1.2
SDK Version: 2.3.2
Components Version: 3.4.0

Looking at the fhir-service.zip file that is packaged during this process, it appears to have roughly 540MB in node_modules when uncompressed.

┌─[~/Downloads/fhir-service] - [2020-12-08 12:04:20]
└─[0] <> du -sh *
 24K	bulkExport
8.0K	ddbToEsLambda
540M	node_modules
4.0K	package.json
 24K	src

Installation Errors with AWS Credentials

I am trying to install this using an AWS EC2 instance running RedHat.

When I go to run the install.sh script, I get the following error:

Could not find any valid AWS credentials. You can configure credentials by running 'aws configure'

When I run aws configure, I get the following:

AWS Access Key ID [****************G5FY]:
AWS Secret Access Key [****************ULcV]:
Default region name [us-east-1]:
Default output format [json]:

The access key and secret key are both active and were created using IAM. Is there something I am missing?

Search based on dates not working

Search based on birthDate on patient api is not working and it is returning zero results even though date are available.

{{API_URL}}/Patient?birthdate=1987-02-20 or {{API_URL}}/Patient?birthDate=1987-02-20

image

How to use an AWS named profile ?

I use AWS named profiles to handle my various AWS accounts, and I wonder how I should use the install.sh script with a named profile ?

I've tried something like AWS_PROFILE=myprofile && sudo "PATH=$PATH" -E ./scripts/install.sh -r eu-west-3 -s dev but I still have the following error message :

Could not find any valid AWS credentials. You can configure credentials by running 'aws configure'. If running this script with sudo you must configure your awscli with 'sudo aws configure'
For more information about configuring the AWS CLI see: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.