You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取AWS账户各服务已启用的可用区域列表?

获取AWS账户中指定服务的已启用可用区域(NestJs实现)

核心思路

放弃静态区域列表包(如aws-regions),直接使用AWS SDK调用EC2 API,针对你的账户筛选已启用且支持目标服务的区域及可用区——这能避免不必要的无效API调用,同时精准匹配你的账户权限。

实现步骤

  1. 安装依赖
    使用AWS SDK v3(NestJs生态推荐版本),安装EC2客户端:
npm install @aws-sdk/client-ec2
  1. 创建区域查询服务
    封装一个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;
  }
}
  1. 控制器调用示例
    创建接口供业务逻辑调用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:42:12