Skip to content

Commit b5723a8

Browse files
Merge pull request #1550 from aligent/feat/load-balancer-auth
Feat/load balancer auth
2 parents 41cd371 + 1c8aa54 commit b5723a8

File tree

6 files changed

+2620
-2127
lines changed

6 files changed

+2620
-2127
lines changed

.changeset/deep-hornets-sip.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@aligent/cdk-graphql-mesh-server": minor
3+
---
4+
5+
Use policy interface rather than plain objects as required in upgraded cdk version

.changeset/twenty-cars-brush.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@aligent/cdk-prerender-fargate": minor
3+
---
4+
5+
Add check for prerender token before hitting the backend

packages/graphql-mesh-server/lib/fargate.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -441,13 +441,14 @@ export class MeshService extends Construct {
441441
this.service = fargateService.service;
442442
this.loadBalancer = fargateService.loadBalancer;
443443

444-
taskDefinition.taskRole.addManagedPolicy({
445-
managedPolicyArn:
446-
"arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy",
447-
});
448-
taskDefinition.taskRole.addManagedPolicy({
449-
managedPolicyArn: "arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess",
450-
});
444+
taskDefinition.taskRole.addManagedPolicy(
445+
iam.ManagedPolicy.fromAwsManagedPolicyName(
446+
"service-role/AmazonECSTaskExecutionRolePolicy"
447+
)
448+
);
449+
taskDefinition.taskRole.addManagedPolicy(
450+
iam.ManagedPolicy.fromAwsManagedPolicyName("AWSXRayDaemonWriteAccess")
451+
);
451452

452453
if (props.authenticationTable) {
453454
const authTable = new dynamodb.Table(this, "authenticationTable", {

packages/prerender-fargate/lib/prerender-fargate.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ import { PrerenderRecacheApi } from "./recaching/prerender-recache-api-construct
1313
import { PrerenderFargateOptions } from "./prerender-fargate-options";
1414
import { PerformanceMetrics } from "./monitoring";
1515
import { LogGroup } from "aws-cdk-lib/aws-logs";
16-
import { SslPolicy } from "aws-cdk-lib/aws-elasticloadbalancingv2";
16+
import {
17+
SslPolicy,
18+
ListenerCondition,
19+
ListenerAction,
20+
CfnListener,
21+
} from "aws-cdk-lib/aws-elasticloadbalancingv2";
1722

1823
/**
1924
* `PrerenderFargate` construct sets up an AWS Fargate service to run a
@@ -223,6 +228,39 @@ export class PrerenderFargate extends Construct {
223228
// Grant S3 Bucket access to the task role
224229
this.bucket.grantReadWrite(fargateService.taskDefinition.taskRole);
225230

231+
// Override the default action to return 403 for unauthorized requests
232+
const listenerCfn = fargateService.listener.node
233+
.defaultChild as CfnListener;
234+
listenerCfn.defaultActions = [
235+
{
236+
type: "fixed-response",
237+
fixedResponseConfig: {
238+
statusCode: "403",
239+
contentType: "application/json",
240+
messageBody: JSON.stringify({
241+
error: "Forbidden",
242+
message: "Missing required header",
243+
}),
244+
},
245+
},
246+
];
247+
248+
// Allow health checks on /health path without token
249+
fargateService.listener.addAction("allow-health-check", {
250+
priority: 50,
251+
conditions: [ListenerCondition.pathPatterns(["/health"])],
252+
action: ListenerAction.forward([fargateService.targetGroup]),
253+
});
254+
255+
// Allow requests WITH the x-prerender-token header (forward to target group)
256+
fargateService.listener.addAction("allow-with-token", {
257+
priority: 100,
258+
conditions: [
259+
ListenerCondition.httpHeader("x-prerender-token", ["*"]), // Any value present
260+
],
261+
action: ListenerAction.forward([fargateService.targetGroup]),
262+
});
263+
226264
// As the prerender service will return a 401 on all unauthorised requests
227265
// It should be considered healthy when receiving a 401 response
228266
fargateService.targetGroup.configureHealthCheck({

packages/prerender-fargate/lib/prerender/server.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const logger = require("./utils/logger");
2222
* @param {...any} args
2323
* @returns
2424
*/
25-
util.log = function (...args) {
25+
util.log = function(...args) {
2626
if (process.env.DISABLE_LOGGING) {
2727
return;
2828
}
@@ -120,7 +120,7 @@ server.use({
120120
return next();
121121
},
122122
// Append a custom header to indicate the response is from Prerender
123-
beforeSend: function (req, res, next) {
123+
beforeSend: function(req, res, next) {
124124
res.setHeader("x-prerender-requestid", crypto.randomUUID());
125125
return next();
126126
},
@@ -144,8 +144,8 @@ server.use({
144144
// The requestReceived and pageLoaded functions are a modified version of
145145
// httpHeader plugin - https://github.com/prerender/prerender/blob/478fa6d0a5196ea29c88c69e64e72eb5507b6d2c/lib/plugins/httpHeaders.js combined with
146146
// s3cache plugin - https://github.com/prerender/prerender-aws-s3-cache/blob/98707fa0f787de83aa41583682cd2c2d330a9cca/index.js
147-
requestReceived: function (req, res, next) {
148-
const fetchCachedObject = function (err, result) {
147+
requestReceived: function(req, res, next) {
148+
const fetchCachedObject = function(err, result) {
149149
if (!err && result) {
150150
logger.info(`Found cached object: ${key}`);
151151

@@ -184,7 +184,7 @@ server.use({
184184
server.use(prerender.removeScriptTags());
185185

186186
server.use({
187-
pageLoaded: function (req, res, next) {
187+
pageLoaded: function(req, res, next) {
188188
const statusCodesToCache = ["200"];
189189

190190
if (process.env.ENABLE_REDIRECT_CACHE.toLowerCase() === "true") {
@@ -196,7 +196,7 @@ server.use({
196196
}
197197

198198
var s3Metadata = {};
199-
const cacheObject = function (err, result) {
199+
const cacheObject = function(err, result) {
200200
if (!err && result) {
201201
logger.info(
202202
`Cached object ${key} already present. Skipping caching...`
@@ -213,7 +213,7 @@ server.use({
213213
Body: req.prerender.content,
214214
Metadata: s3Metadata,
215215
},
216-
function (err, result) {
216+
function(err, result) {
217217
logger.info(result);
218218
if (err) logger.error(err);
219219
}

0 commit comments

Comments
 (0)