Skip to main content
Version: v0.1.0

AWS S3 Storage Integration

Guide to configuring AWS S3 for document storage in Ciyex EHR.

Overview

Ciyex EHR uses AWS S3 (Simple Storage Service) to store patient documents, medical images, and generated reports securely.

Features

  • Secure Storage: All files are encrypted at rest using server-side encryption.
  • Pre-signed URLs: Secure, temporary access to private objects.
  • Versioning: Keep track of document revisions.
  • Lifecycle Policies: Automatically archive old documents to Glacier.

Prerequisites

  1. AWS Account
  2. S3 Bucket created
  3. IAM User with S3 access

Deployment Configuration

1. Create S3 Bucket

Create a private bucket (e.g., ciyex-documents-prod). Enable Block Public Access settings. Enable Default Encryption (SSE-S3 or SSE-KMS).

2. IAM Policy

Create an IAM policy for the application user:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::ciyex-documents-prod",
"arn:aws:s3:::ciyex-documents-prod/*"
]
}
]
}

3. Application Configuration

Configure application.yml or environment variables:

aws:
access-key: ${AWS_ACCESS_KEY_ID}
secret-key: ${AWS_SECRET_ACCESS_KEY}
region: us-east-1
s3:
bucket: ciyex-documents-prod

Backend Implementation

The backend uses the AWS SDK for Java to interact with S3.

Uploading Documents

public String uploadFile(MultipartFile file, String patientId) {
String key = "patients/" + patientId + "/" + UUID.randomUUID();
s3Client.putObject(new PutObjectRequest(bucketName, key, file.getInputStream(), metadata));
return key;
}

Generating Presigned URLs

For viewing documents in the frontend without public access:

public URL generatePresignedUrl(String key) {
Date expiration = new Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 15; // 15 minutes
expiration.setTime(expTimeMillis);

GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucketName, key)
.withMethod(HttpMethod.GET)
.withExpiration(expiration);

return s3Client.generatePresignedUrl(generatePresignedUrlRequest);
}

Alternatives

Azure Blob Storage

The storage service is abstracted, so Azure Blob Storage can be implemented by providing an AzureStorageService implementation.

MinIO (Self-Hosted)

For on-premise deployments, MinIO offers an S3-compatible API. Point the endpoint configuration to your MinIO server.

aws:
s3:
endpoint: http://minio-server:9000