Skip to content

Commit 0badb3f

Browse files
Merge branch 'main' into ndr-55
2 parents 3da4252 + 0537817 commit 0badb3f

25 files changed

+199
-41
lines changed

.github/workflows/terraform-daily-healthcheck-deploy-and-destroy.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ jobs:
8282

8383
react_testing_job:
8484
name: Run UI Unit Tests
85-
uses: nhsconnect/national-document-repository/.github/workflows/base-jest-test.yml@main
85+
uses: nhsconnect/national-document-repository/.github/workflows/base-vitest-test.yml@main
8686
with:
8787
build_branch: main
8888

@@ -126,7 +126,7 @@ jobs:
126126
uses: cypress-io/github-action@v6
127127
with:
128128
install: false
129-
start: serve -s build
129+
start: serve -s dist
130130
browser: chrome
131131
working-directory: ./app
132132
env:
@@ -136,13 +136,14 @@ jobs:
136136
- uses: actions/upload-artifact@v4
137137
if: failure()
138138
with:
139-
name: cypress-screenshots
139+
name: cypress-screenshots-chrome
140140
path: /home/runner/work/national-document-repository/national-document-repository/app/cypress/screenshots
141141
if-no-files-found: ignore
142+
142143
- uses: actions/upload-artifact@v4
143144
if: failure()
144145
with:
145-
name: cypress-videos
146+
name: cypress-videos-chrome
146147
path: /home/runner/work/national-document-repository/national-document-repository/app/cypress/videos
147148
if-no-files-found: ignore
148149

.github/workflows/terraform-dev-to-main-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ jobs:
121121
)
122122
123123
# Optionally redact sensitive strings in the PLAN_FULL variable
124+
PLAN_FULL=$(echo "$PLAN_FULL" | sed -E 's#arn:aws:iam::[0-9]{12}:role/[a-zA-Z0-9_-]+#[REDACTED_IAM_ROLE_ARN]#g')
124125
PLAN_FULL=$(echo "$PLAN_FULL" | sed -E 's/[0-9]{12}/[REDACTED_AWS_ACCOUNT_ID]/g')
125126
PLAN_FULL=$(echo "$PLAN_FULL" | sed -E 's#https://[a-zA-Z0-9.-]+\.lambda\.amazonaws\.com/[a-zA-Z0-9/._-]+#[REDACTED_LAMBDA_URL]#g')
126127
PLAN_FULL=$(echo "$PLAN_FULL" | sed -E 's#https://[a-zA-Z0-9.-]+\.execute-api\.[a-zA-Z0-9.-]+\.amazonaws\.com/[a-zA-Z0-9/._-]*#[REDACTED_API_GATEWAY_URL]#g')
127-
PLAN_FULL=$(echo "$PLAN_FULL" | sed -E 's#arn:aws:iam::[0-9]{12}:role/[a-zA-Z0-9_-]+#[REDACTED_IAM_ROLE_ARN]#g')
128128
129129
echo "PLAN<<EOF" >> $GITHUB_ENV
130130
echo "${PLAN_FULL::$LENGTH}" >> $GITHUB_ENV

infrastructure/README.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
| <a name="module_cloudfront-distribution-lg"></a> [cloudfront-distribution-lg](#module\_cloudfront-distribution-lg) | ./modules/cloudfront | n/a |
4646
| <a name="module_cloudfront_edge_dynamodb_table"></a> [cloudfront\_edge\_dynamodb\_table](#module\_cloudfront\_edge\_dynamodb\_table) | ./modules/dynamo_db | n/a |
4747
| <a name="module_cloudfront_firewall_waf_v2"></a> [cloudfront\_firewall\_waf\_v2](#module\_cloudfront\_firewall\_waf\_v2) | ./modules/firewall_waf_v2 | n/a |
48-
| <a name="module_create-doc-ref-gateway"></a> [create-doc-ref-gateway](#module\_create-doc-ref-gateway) | ./modules/gateway | n/a |
4948
| <a name="module_create-doc-ref-lambda"></a> [create-doc-ref-lambda](#module\_create-doc-ref-lambda) | ./modules/lambda | n/a |
5049
| <a name="module_create-token-gateway"></a> [create-token-gateway](#module\_create-token-gateway) | ./modules/gateway | n/a |
5150
| <a name="module_create-token-lambda"></a> [create-token-lambda](#module\_create-token-lambda) | ./modules/lambda | n/a |
@@ -68,6 +67,7 @@
6867
| <a name="module_document_manifest_alarm"></a> [document\_manifest\_alarm](#module\_document\_manifest\_alarm) | ./modules/lambda_alarms | n/a |
6968
| <a name="module_document_manifest_alarm_topic"></a> [document\_manifest\_alarm\_topic](#module\_document\_manifest\_alarm\_topic) | ./modules/sns | n/a |
7069
| <a name="module_document_reference_dynamodb_table"></a> [document\_reference\_dynamodb\_table](#module\_document\_reference\_dynamodb\_table) | ./modules/dynamo_db | n/a |
70+
| <a name="module_document_reference_gateway"></a> [document\_reference\_gateway](#module\_document\_reference\_gateway) | ./modules/gateway | n/a |
7171
| <a name="module_edge-presign-lambda"></a> [edge-presign-lambda](#module\_edge-presign-lambda) | ./modules/lambda_edge | n/a |
7272
| <a name="module_edge_presign_alarm"></a> [edge\_presign\_alarm](#module\_edge\_presign\_alarm) | ./modules/lambda_alarms | n/a |
7373
| <a name="module_edge_presign_alarm_topic"></a> [edge\_presign\_alarm\_topic](#module\_edge\_presign\_alarm\_topic) | ./modules/sns | n/a |
@@ -82,7 +82,7 @@
8282
| <a name="module_generate-lloyd-george-stitch-alarm"></a> [generate-lloyd-george-stitch-alarm](#module\_generate-lloyd-george-stitch-alarm) | ./modules/lambda_alarms | n/a |
8383
| <a name="module_generate-lloyd-george-stitch-alarm-topic"></a> [generate-lloyd-george-stitch-alarm-topic](#module\_generate-lloyd-george-stitch-alarm-topic) | ./modules/sns | n/a |
8484
| <a name="module_generate-lloyd-george-stitch-lambda"></a> [generate-lloyd-george-stitch-lambda](#module\_generate-lloyd-george-stitch-lambda) | ./modules/lambda | n/a |
85-
| <a name="module_get-doc-nrl-lambda"></a> [get-doc-nrl-lambda](#module\_get-doc-nrl-lambda) | ./modules/lambda | n/a |
85+
| <a name="module_get-doc-fhir-lambda"></a> [get-doc-fhir-lambda](#module\_get-doc-fhir-lambda) | ./modules/lambda | n/a |
8686
| <a name="module_get-report-by-ods-alarm"></a> [get-report-by-ods-alarm](#module\_get-report-by-ods-alarm) | ./modules/lambda_alarms | n/a |
8787
| <a name="module_get-report-by-ods-alarm-topic"></a> [get-report-by-ods-alarm-topic](#module\_get-report-by-ods-alarm-topic) | ./modules/sns | n/a |
8888
| <a name="module_get-report-by-ods-gateway"></a> [get-report-by-ods-gateway](#module\_get-report-by-ods-gateway) | ./modules/gateway | n/a |
@@ -129,6 +129,7 @@
129129
| <a name="module_pdf-stitching-lambda"></a> [pdf-stitching-lambda](#module\_pdf-stitching-lambda) | ./modules/lambda | n/a |
130130
| <a name="module_pdf-stitching-lambda-alarms"></a> [pdf-stitching-lambda-alarms](#module\_pdf-stitching-lambda-alarms) | ./modules/lambda_alarms | n/a |
131131
| <a name="module_route53_fargate_ui"></a> [route53\_fargate\_ui](#module\_route53\_fargate\_ui) | ./modules/route53 | n/a |
132+
| <a name="module_search-document-references-fhir-lambda"></a> [search-document-references-fhir-lambda](#module\_search-document-references-fhir-lambda) | ./modules/lambda | n/a |
132133
| <a name="module_search-document-references-gateway"></a> [search-document-references-gateway](#module\_search-document-references-gateway) | ./modules/gateway | n/a |
133134
| <a name="module_search-document-references-lambda"></a> [search-document-references-lambda](#module\_search-document-references-lambda) | ./modules/lambda | n/a |
134135
| <a name="module_search-patient-details-gateway"></a> [search-patient-details-gateway](#module\_search-patient-details-gateway) | ./modules/gateway | n/a |
@@ -187,6 +188,7 @@
187188
| [aws_api_gateway_integration_response.get_document_reference_mock_403_response](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_integration_response) | resource |
188189
| [aws_api_gateway_integration_response.get_document_reference_mock_404_response](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_integration_response) | resource |
189190
| [aws_api_gateway_method.get_document_reference](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_method) | resource |
191+
| [aws_api_gateway_method.get_document_references_fhir](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_method) | resource |
190192
| [aws_api_gateway_method.login_proxy_method](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_method) | resource |
191193
| [aws_api_gateway_method.sandbox_get_document_reference](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_method) | resource |
192194
| [aws_api_gateway_method_response.response_200](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_method_response) | resource |
@@ -219,6 +221,7 @@
219221
| [aws_cloudwatch_event_target.nhs_oauth_token_generator_schedule](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target) | resource |
220222
| [aws_cloudwatch_event_target.statistical_report_schedule_event](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target) | resource |
221223
| [aws_cloudwatch_log_metric_filter.edge_presign_error](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_metric_filter) | resource |
224+
| [aws_cloudwatch_log_metric_filter.pds_tracker](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_metric_filter) | resource |
222225
| [aws_cloudwatch_log_resource_policy.rum_log](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_resource_policy) | resource |
223226
| [aws_cloudwatch_metric_alarm.api_gateway_alarm_4XX](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm) | resource |
224227
| [aws_cloudwatch_metric_alarm.api_gateway_alarm_5XX](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm) | resource |
@@ -252,8 +255,8 @@
252255
| [aws_iam_role.cross_account_backup_iam_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
253256
| [aws_iam_role.data_collection_ecs_execution](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
254257
| [aws_iam_role.data_collection_task_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
258+
| [aws_iam_role.get_fhir_doc_presign_url_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
255259
| [aws_iam_role.manifest_presign_url_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
256-
| [aws_iam_role.nrl_get_doc_presign_url_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
257260
| [aws_iam_role.ods_report_presign_url_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
258261
| [aws_iam_role.s3_backup_iam_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
259262
| [aws_iam_role.splunk_sqs_forwarder](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
@@ -276,9 +279,9 @@
276279
| [aws_iam_role_policy_attachment.data_collection_ssm_access_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
277280
| [aws_iam_role_policy_attachment.data_collection_statistical_reports_store](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
278281
| [aws_iam_role_policy_attachment.data_collection_statistics_dynamodb_table](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
282+
| [aws_iam_role_policy_attachment.get_doc_presign_url](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
279283
| [aws_iam_role_policy_attachment.lambda_stitch-lambda](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
280284
| [aws_iam_role_policy_attachment.manifest_presign_url](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
281-
| [aws_iam_role_policy_attachment.nrl_get_doc_presign_url](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
282285
| [aws_iam_role_policy_attachment.ods_report_presign_url](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
283286
| [aws_iam_role_policy_attachment.policy_audit_get-report-by-ods-lambda](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
284287
| [aws_iam_role_policy_attachment.policy_audit_search-patient-details-lambda](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
@@ -357,6 +360,7 @@
357360
| Name | Description | Type | Default | Required |
358361
|------|-------------|------|---------|:--------:|
359362
| <a name="input_access_audit_dynamodb_table_name"></a> [access\_audit\_dynamodb\_table\_name](#input\_access\_audit\_dynamodb\_table\_name) | The name of the dynamodb table to store the audit of access to deceased patient records | `string` | `"AccessAudit"` | no |
363+
| <a name="input_apim_environment"></a> [apim\_environment](#input\_apim\_environment) | n/a | `any` | n/a | yes |
360364
| <a name="input_auth_session_dynamodb_table_name"></a> [auth\_session\_dynamodb\_table\_name](#input\_auth\_session\_dynamodb\_table\_name) | The name of the dynamodb table to store user login sessions | `string` | `"AuthSessionReferenceMetadata"` | no |
361365
| <a name="input_auth_state_dynamodb_table_name"></a> [auth\_state\_dynamodb\_table\_name](#input\_auth\_state\_dynamodb\_table\_name) | The name of the dynamodb table to store the state values (for CIS2 authorisation) | `string` | `"AuthStateReferenceMetadata"` | no |
362366
| <a name="input_availability_zones"></a> [availability\_zones](#input\_availability\_zones) | This is a list that specifies all the Availability Zones that will have a pair of public and private subnets | `list(string)` | <pre>[<br/> "eu-west-2a",<br/> "eu-west-2b",<br/> "eu-west-2c"<br/>]</pre> | no |

infrastructure/api.tf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ resource "aws_api_gateway_deployment" "ndr_api_deploy" {
4747
module.access-audit-lambda,
4848
module.back-channel-logout-gateway,
4949
module.back_channel_logout_lambda,
50-
module.create-doc-ref-gateway,
50+
module.document_reference_gateway,
5151
module.create-doc-ref-lambda,
5252
module.create-token-gateway,
5353
module.create-token-lambda,
@@ -57,6 +57,7 @@ resource "aws_api_gateway_deployment" "ndr_api_deploy" {
5757
module.document-manifest-job-lambda,
5858
module.feature-flags-gateway,
5959
module.feature-flags-lambda,
60+
module.get-doc-fhir-lambda,
6061
module.get-report-by-ods-gateway,
6162
module.get-report-by-ods-lambda,
6263
module.lloyd-george-stitch-gateway,

infrastructure/buckets.tf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,22 @@ module "ndr-lloyd-george-store" {
5353
cloudfront_enabled = true
5454
cloudfront_arn = module.cloudfront-distribution-lg.cloudfront_arn
5555
bucket_name = var.lloyd_george_bucket_name
56-
enable_cors_configuration = contains(["prod"], terraform.workspace) ? false : true
5756
enable_bucket_versioning = true
5857
environment = var.environment
5958
owner = var.owner
6059
force_destroy = local.is_force_destroy
60+
enable_cors_configuration = true
6161
cors_rules = [
6262
{
6363
allowed_headers = ["*"]
6464
allowed_methods = ["POST", "PUT", "DELETE"]
65-
allowed_origins = ["https://${terraform.workspace}.${var.domain}"]
65+
allowed_origins = [contains(["prod"], terraform.workspace) ? "https://${var.domain}" : "https://${terraform.workspace}.${var.domain}"]
6666
expose_headers = ["ETag"]
6767
max_age_seconds = 3000
6868
},
6969
{
7070
allowed_methods = ["GET"]
71-
allowed_origins = ["https://${terraform.workspace}.${var.domain}"]
71+
allowed_origins = [contains(["prod"], terraform.workspace) ? "https://${var.domain}" : "https://${terraform.workspace}.${var.domain}"]
7272
}
7373
]
7474
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
locals {
2+
pds_tracking_lambdas = [
3+
"SearchPatientDetailsLambda",
4+
"BulkUploadLambda",
5+
"MNSNotificationLambda"
6+
]
7+
}
8+
9+
resource "aws_cloudwatch_log_metric_filter" "pds_tracker" {
10+
for_each = local.is_sandbox ? [] : toset(local.pds_tracking_lambdas)
11+
12+
name = "PDSUsageMetricFilter-${each.key}"
13+
pattern = "%NDR-TR1%"
14+
log_group_name = "/aws/lambda/${terraform.workspace}_${each.key}"
15+
16+
metric_transformation {
17+
name = "PDSEventCount"
18+
namespace = "NDRInsights"
19+
value = "1"
20+
}
21+
}

infrastructure/dev.tfvars

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@ poll_frequency = "3600"
1010
standalone_vpc_tag = "ndr-dev"
1111
standalone_vpc_ig_tag = "ndr-dev"
1212

13-
cloud_security_email_param_environment = "dev"
13+
cloud_security_email_param_environment = "dev"
14+
15+
apim_environment = "internal-dev."
16+

infrastructure/firewall.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,12 @@ resource "aws_wafv2_web_acl_association" "web_acl_association" {
1616
]
1717
}
1818

19+
resource "aws_wafv2_web_acl_association" "api_gateway" {
20+
resource_arn = aws_api_gateway_stage.ndr_api.arn
21+
web_acl_arn = module.firewall_waf_v2[0].arn
22+
count = local.is_sandbox ? 0 : 1
23+
depends_on = [
24+
aws_api_gateway_stage.ndr_api,
25+
module.firewall_waf_v2[0]
26+
]
27+
}

infrastructure/iam.tf

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ resource "aws_iam_role_policy_attachment" "manifest_presign_url" {
115115

116116

117117
resource "aws_iam_policy" "s3_document_data_policy_for_get_doc_ref_lambda" {
118-
name = "${terraform.workspace}_get_document_only_policy_for_nrl_get_doc_lambda"
118+
name = "${terraform.workspace}_get_document_only_policy_for_get_doc_lambda"
119119

120120
policy = jsonencode({
121121
"Version" : "2012-10-17",
@@ -132,23 +132,27 @@ resource "aws_iam_policy" "s3_document_data_policy_for_get_doc_ref_lambda" {
132132
}
133133

134134
data "aws_iam_policy_document" "assume_role_policy_for_get_doc_ref_lambda" {
135+
count = 1
135136
statement {
136137
actions = ["sts:AssumeRole"]
137138

138139
principals {
139140
type = "AWS"
140-
identifiers = [module.get-doc-nrl-lambda.lambda_execution_role_arn]
141+
identifiers = [module.get-doc-fhir-lambda[0].lambda_execution_role_arn]
141142
}
142143
}
143144
}
144145

145-
resource "aws_iam_role" "nrl_get_doc_presign_url_role" {
146-
name = "${terraform.workspace}_nrl_get_doc_presign_url_role"
147-
assume_role_policy = data.aws_iam_policy_document.assume_role_policy_for_get_doc_ref_lambda.json
146+
resource "aws_iam_role" "get_fhir_doc_presign_url_role" {
147+
count = 1
148+
name = "${terraform.workspace}_get_fhir_doc_presign_url_role"
149+
assume_role_policy = data.aws_iam_policy_document.assume_role_policy_for_get_doc_ref_lambda[0].json
148150
}
149151

150-
resource "aws_iam_role_policy_attachment" "nrl_get_doc_presign_url" {
151-
role = aws_iam_role.nrl_get_doc_presign_url_role.name
152+
153+
resource "aws_iam_role_policy_attachment" "get_doc_presign_url" {
154+
count = 1
155+
role = aws_iam_role.get_fhir_doc_presign_url_role[0].name
152156
policy_arn = aws_iam_policy.s3_document_data_policy_for_get_doc_ref_lambda.arn
153157
}
154158

infrastructure/lambda-bulk-upload-metadata-preprocessor.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ module "bulk_upload_metadata_preprocessor_lambda" {
2222
is_gateway_integration_needed = false
2323
is_invoked_from_gateway = false
2424
lambda_timeout = 900
25+
memory_size = 1769
2526
reserved_concurrent_executions = local.bulk_upload_lambda_concurrent_limit
2627
}

0 commit comments

Comments
 (0)