diff --git a/builtin/providers/aws/data_source_availability_zones.go b/builtin/providers/aws/data_source_availability_zones.go new file mode 100644 index 000000000..a674de1eb --- /dev/null +++ b/builtin/providers/aws/data_source_availability_zones.go @@ -0,0 +1,52 @@ +package aws + +import ( + "fmt" + "log" + "sort" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/hashicorp/terraform/helper/schema" +) + +func dataSourceAwsAvailabilityZones() *schema.Resource { + return &schema.Resource{ + Read: dataSourceAwsAvailabilityZonesRead, + + Schema: map[string]*schema.Schema{ + "instance": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + } +} + +func dataSourceAwsAvailabilityZonesRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).ec2conn + + log.Printf("[DEBUG] Reading availability zones") + d.SetId(time.Now().UTC().String()) + + req := &ec2.DescribeAvailabilityZonesInput{DryRun: aws.Bool(false)} + azresp, err := conn.DescribeAvailabilityZones(req) + if err != nil { + return fmt.Errorf("Error listing availability zones: %s", err) + } + + raw := make([]string, len(azresp.AvailabilityZones)) + for i, v := range azresp.AvailabilityZones { + raw[i] = *v.ZoneName + } + + sort.Strings(raw) + + if err := d.Set("instance", raw); err != nil { + return fmt.Errorf("[WARN] Error setting availability zones") + } + + return nil +} diff --git a/builtin/providers/aws/provider.go b/builtin/providers/aws/provider.go index 1c61db81b..1ef643553 100644 --- a/builtin/providers/aws/provider.go +++ b/builtin/providers/aws/provider.go @@ -110,6 +110,10 @@ func Provider() terraform.ResourceProvider { }, }, + DataSourcesMap: map[string]*schema.Resource{ + "aws_availability_zones": dataSourceAwsAvailabilityZones(), + }, + ResourcesMap: map[string]*schema.Resource{ "aws_ami": resourceAwsAmi(), "aws_ami_copy": resourceAwsAmiCopy(), diff --git a/website/source/docs/providers/aws/d/availability_zones.html.markdown b/website/source/docs/providers/aws/d/availability_zones.html.markdown new file mode 100644 index 000000000..fb48f418e --- /dev/null +++ b/website/source/docs/providers/aws/d/availability_zones.html.markdown @@ -0,0 +1,39 @@ +--- +layout: "aws" +page_title: "AWS: aws_availability_zones" +sidebar_current: "docs-aws-datasource-availability-zones" +description: |- + Provides a list of availability zones which can be used by an AWS account +--- + +# aws\_availability\_zones + +The Availability Zones data source allows access to the list of AWS +Availability Zones which can be accessed by an AWS account within the region +configured in the provider. + +## Example Usage + +``` +# Declare the data source +data "aws_availability_zones" "zones" {} + +# Create a subnet in each availability zone +resource "aws_subnet" "public" { + count = "${length(data.aws_availability_zones.zones.instance)}" + + availability_zone = "${data.aws_availability_zones.zones.instance[count.index]}" + + # Other properties... +} +``` + +## Argument Reference + +There are no arguments for this data source. + +## Attributes Reference + +The following attributes are exported: + +* `instance` - A list of the availability zone names available to the account. diff --git a/website/source/layouts/aws.erb b/website/source/layouts/aws.erb index 55d25ff7f..5b938d970 100644 --- a/website/source/layouts/aws.erb +++ b/website/source/layouts/aws.erb @@ -10,6 +10,15 @@ AWS Provider + + Data Sources + + + > API Gateway Resources