この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
CLIでの利用可能AZ取得記事
C#での利用可能AZ取得
CLIで利用可能AZを取得する記事があったので、C#でも取得してみました。その際、GovCloudや北京リージョンに関してもデータが取得できたので本記事で取り上げます。データ取得のコードは下記です。下記ではリージョンエンドポイント一覧を定数から取得していますが、厳密に行う場合はコメントアウトしている処理のようにDescribeRegionsメソッドを実行して取得するのが良いと思います。
internal static void DescribeAvailabilityZones()
{
Debug.WriteLine("RegionName\t:ZoneName\t\t:ZoneState");
//var req = new DescribeRegionsRequest();
//var ec2 = new AmazonEC2Client(Amazon.RegionEndpoint.USEast1);
//var res = ec2.DescribeRegions(req);
//var regions = res.Regions;
foreach (var region in Amazon.RegionEndpoint.EnumerableAllRegions)
{
var ec2Client = new AmazonEC2Client(region);
var request = new DescribeAvailabilityZonesRequest();
try
{
var response = ec2Client.DescribeAvailabilityZones(request);
var availabilityZones = response.AvailabilityZones;
foreach (var az in availabilityZones)
{
Debug.WriteLine(az.RegionName + "\t:" + az.ZoneName + "\t\t:" + az.State);
}
}
catch (Exception ex)
{
// GovCloud等の処理はスキップする
}
}
}
私のAWSアカウントで上記を実行した結果は下記です(何故かExcelで自動整形されていますが気にしないでください)
DescribeAvailabilityZones実行時のエラー
プログラムをデバッグしていると上記プログラムを実行時に2度例外が発生していました。それぞれのエラーログの一部と例外オブジェクトの一部の値は下記になります:
[Amazon.EC2.AmazonEC2Exception] {"AWS was not able to validate the provided access credentials"} Amazon.EC2.AmazonEC2Exception
InnerException {"リモート サーバーがエラーを返しました: (401) 許可されていません"} System.Exception {Amazon.Runtime.Internal.HttpErrorResponseException}
DisplayName "US GovCloud West (Oregon)" string
SystemName "us-gov-west-1" string
[Amazon.EC2.AmazonEC2Exception] {"AWS was not able to validate the provided access credentials"} Amazon.EC2.AmazonEC2Exception
InnerException {"リモート サーバーがエラーを返しました: (401) 許可されていません"} System.Exception {Amazon.Runtime.Internal.HttpErrorResponseException}
DisplayName "China (Beijing)" string
SystemName "cn-north-1" string
上記はAPIを実行したAWSアカウントがUS GovCloud West (Oregon)とChina (Beijing)を利用できない(401エラー)ことを示しています。特にEC2周りの権限を絞っていないIAMユーザーでプログラムを実行したので、特別な設定を裏で行なっていないAWSアカウント、特に日本の皆さんが利用しているAWSアカウントに関しては共通で上記2つのリージョンにアクセス出来ない設定になっているのではないかと思いました。