lambda-layers/lib/get-regions.ts (66 lines of code) (raw):

/** * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import { SSMClient, GetParametersByPathCommand, } from '@aws-sdk/client-ssm'; // Regions introduced before March 20, 2019 are enabled by default, so we maintain this // allowlist to only publish to these regions since we can gurantee the account uses them. // See https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html const REGION_ALLOW_LIST = [ 'ap-northeast-1', 'ap-northeast-2', 'ap-northeast-3', 'ap-south-1', 'ap-southeast-1', 'ap-southeast-2', 'ca-central-1', 'eu-central-1', 'eu-north-1', 'eu-west-1', 'eu-west-2', 'eu-west-3', 'sa-east-1', 'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2' ]; function isValidRegion(region: string): boolean { return ( REGION_ALLOW_LIST.includes(region) && !region.startsWith('cn-') && !region.startsWith('us-gov-') ); } export async function getRegions(): Promise<Array<string>> { const ssm = new SSMClient({ region: 'us-west-2', }); let moreData = true; let data = await ssm.send(new GetParametersByPathCommand({ Path: '/aws/service/global-infrastructure/services/lambda/regions', })); const regions: Array<string> = [] while(moreData) { if (!data.Parameters) { throw new Error('Failed to get regions from SSM'); } const parameters = data.Parameters; for (const parameter of parameters) { if (!parameter.Value) { console.error(`No value found for ${parameter}`); continue; } if (isValidRegion(parameter.Value)) { regions.push(parameter.Value); } else { console.log(`Skipping ${parameter.Value}`) } } if (data.NextToken) { data = await ssm.send(new GetParametersByPathCommand({ Path: '/aws/service/global-infrastructure/services/lambda/regions', NextToken: data.NextToken, })); } else { moreData = false; } } return regions; }