Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 2x 2x 2x 2x 6x 6x 6x 6x 6x 6x 6x 5x 4x 4x 6x 6x 6x 5x 2x 2x 2x 2x 4x 4x | import { APIGatewayProxyResult } from 'aws-lambda'
import type { DeploymentSettings } from '../model/DeploymentSettings'
import { LambdaClient, GetFunctionCommand } from '@aws-sdk/client-lambda'
import { CloudFrontClient, GetDistributionCommand } from '@aws-sdk/client-cloudfront'
import type {
IntegrationStatus,
LambdaFunctionInformation,
CloudFrontDistributionInformation,
} from '../model/IntegrationStatus'
import {
doesCacheBehaviorUseOrigins,
getCacheBehaviorLambdaFunctionAssociations,
getFPCDNOrigins,
} from '../utils/cloudfrontUtils'
export async function handleStatus(
lambdaClient: LambdaClient,
cloudFrontClient: CloudFrontClient,
settings: DeploymentSettings
): Promise<APIGatewayProxyResult> {
const lambdaFunctionInformation = await getLambdaFunctionInformation(lambdaClient, settings.LambdaFunctionName)
const cloudFrontDistributionInformation = await getCloudFrontDistributionInformation(
cloudFrontClient,
settings.CFDistributionId,
settings.LambdaFunctionName
)
const result: IntegrationStatus = {
lambdaFunction: lambdaFunctionInformation,
cloudFrontDistribution: cloudFrontDistributionInformation,
}
return {
statusCode: 200,
body: JSON.stringify(result),
headers: {
'content-type': 'application/json',
},
}
}
async function getLambdaFunctionInformation(
lambdaClient: LambdaClient,
functionName: string
): Promise<LambdaFunctionInformation | undefined> {
const command = new GetFunctionCommand({ FunctionName: functionName })
try {
const result = await lambdaClient.send(command)
return {
functionName: result.Configuration?.FunctionName,
lastModified: result.Configuration?.LastModified,
lastUpdateStatus: result.Configuration?.LastUpdateStatus,
lastUpdateStatusReason: result.Configuration?.LastUpdateStatusReason,
lastUpdateStatusCode: result.Configuration?.LastUpdateStatusReasonCode,
runtime: result.Configuration?.Runtime,
version: result.Configuration?.Version,
handler: result.Configuration?.Handler,
}
} catch (error) {
console.error('Unable to get lambda function information', error)
return undefined
}
}
async function getCloudFrontDistributionInformation(
cloudFrontClient: CloudFrontClient,
distributionId: string,
functionName: string
): Promise<CloudFrontDistributionInformation | undefined> {
const command = new GetDistributionCommand({ Id: distributionId })
try {
const result = await cloudFrontClient.send(command)
const fpCDNOrigins = getFPCDNOrigins(result.Distribution?.DistributionConfig)
let cacheBehaviorsWithFingerprintFunction = 0
Iif (doesCacheBehaviorUseOrigins(result.Distribution?.DistributionConfig?.DefaultCacheBehavior, fpCDNOrigins)) {
const lambdaAssocList = getCacheBehaviorLambdaFunctionAssociations(
result.Distribution?.DistributionConfig?.DefaultCacheBehavior,
functionName
)
cacheBehaviorsWithFingerprintFunction += lambdaAssocList.length
}
for (const cacheBehavior of result.Distribution?.DistributionConfig?.CacheBehaviors?.Items || []) {
Iif (!doesCacheBehaviorUseOrigins(cacheBehavior, fpCDNOrigins)) {
continue
}
const lambdaAssocList = getCacheBehaviorLambdaFunctionAssociations(cacheBehavior, functionName)
cacheBehaviorsWithFingerprintFunction += lambdaAssocList.length
}
return {
id: result.Distribution?.Id,
enabled: result.Distribution?.DistributionConfig?.Enabled,
status: result.Distribution?.Status,
lastModifiedTime: result.Distribution?.LastModifiedTime,
inProgressInvalidationBatches: result.Distribution?.InProgressInvalidationBatches,
cacheBehaviorsWithFingerprintFunction: cacheBehaviorsWithFingerprintFunction,
}
} catch (error) {
console.error('Unable to get CloudFront distribution information', error)
return
}
}
|