如何获取AWS账户各服务已启用的可用区域列表?
获取AWS账户中指定服务的已启用可用区域(NestJs实现)
核心思路
放弃静态区域列表包(如aws-regions),直接使用AWS SDK调用EC2 API,针对你的账户筛选已启用且支持目标服务的区域及可用区——这能避免不必要的无效API调用,同时精准匹配你的账户权限。
实现步骤
- 安装依赖
使用AWS SDK v3(NestJs生态推荐版本),安装EC2客户端:
npm install @aws-sdk/client-ec2
- 创建区域查询服务
封装一个NestJs服务,负责与AWS API交互:
import { Injectable } from '@nestjs/common'; import { EC2Client, DescribeRegionsCommand, DescribeAvailabilityZonesCommand } from '@aws-sdk/client-ec2'; @Injectable() export class AwsRegionService { private ec2Client: EC2Client; constructor() { // 初始化EC2客户端,凭证优先用环境变量或IAM角色(部署在AWS时) this.ec2Client = new EC2Client({ credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, }, }); } // 根据服务名称获取已启用区域及对应可用区 async getEnabledRegionsWithZones(service: string): Promise<Record<string, string[]>> { // 第一步:筛选账户已启用且支持目标服务的区域 const regionsCmd = new DescribeRegionsCommand({ Filters: [{ Name: 'service', Values: [service] }], AllRegions: false, // 仅返回账户已启用的区域 }); const regionsRes = await this.ec2Client.send(regionsCmd); const enabledRegions = regionsRes.Regions?.map(r => r.RegionName) || []; // 第二步:遍历区域,获取每个区域的可用可用区 const regionZonesMap: Record<string, string[]> = {}; for (const region of enabledRegions) { const zonesCmd = new DescribeAvailabilityZonesCommand({ RegionNames: [region], Filters: [{ Name: 'state', Values: ['available'] }], // 仅返回可用状态的可用区 }); const zonesRes = await this.ec2Client.send(zonesCmd); regionZonesMap[region] = zonesRes.AvailabilityZones?.map(z => z.ZoneName) || []; } return regionZonesMap; } }
- 控制器调用示例
创建接口供业务逻辑调用:
import { Controller, Get, Query } from '@nestjs/common'; import { AwsRegionService } from './aws-region.service'; @Controller('aws-regions') export class AwsRegionController { constructor(private readonly regionService: AwsRegionService) {} @Get() async getServiceRegions(@Query('service') service: string) { if (!service) { return { error: '需指定服务名称,例如 ec2、ebs' }; } return this.regionService.getEnabledRegionsWithZones(service); } }
关键说明
- 为什么不用
aws-regions:该包提供的是AWS全局区域的静态列表,无法区分你的账户是否启用了对应区域,也不能按服务筛选,会导致后续调用未启用区域的服务API时出错。 - 服务代码对应关系:比如EC2对应
ec2、EBS对应ebs,各服务的标准代码可参考AWS官方文档。 - 权限配置:确保你的AWS凭证拥有
ec2:DescribeRegions和ec2:DescribeAvailabilityZones权限,否则会返回权限错误。 - 性能优化:区域启用状态不会频繁变更,可给查询结果添加缓存(如Redis),减少重复API调用。
内容的提问来源于stack exchange,提问作者code_optimizer
相关产品推荐
相关产品推荐

