package aws import ( "fmt" "log" "regexp" "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/schema" ) func dataSourceAwsAmiIds() *schema.Resource { return &schema.Resource{ Read: dataSourceAwsAmiIdsRead, Schema: map[string]*schema.Schema{ "filter": dataSourceFiltersSchema(), "executable_users": { Type: schema.TypeList, Optional: true, ForceNew: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "name_regex": { Type: schema.TypeString, Optional: true, ForceNew: true, ValidateFunc: validateNameRegex, }, "owners": { Type: schema.TypeList, Optional: true, ForceNew: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "tags": dataSourceTagsSchema(), "ids": &schema.Schema{ Type: schema.TypeList, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, }, } } func dataSourceAwsAmiIdsRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn executableUsers, executableUsersOk := d.GetOk("executable_users") filters, filtersOk := d.GetOk("filter") nameRegex, nameRegexOk := d.GetOk("name_regex") owners, ownersOk := d.GetOk("owners") if executableUsersOk == false && filtersOk == false && nameRegexOk == false && ownersOk == false { return fmt.Errorf("One of executable_users, filters, name_regex, or owners must be assigned") } params := &ec2.DescribeImagesInput{} if executableUsersOk { params.ExecutableUsers = expandStringList(executableUsers.([]interface{})) } if filtersOk { params.Filters = buildAwsDataSourceFilters(filters.(*schema.Set)) } if ownersOk { o := expandStringList(owners.([]interface{})) if len(o) > 0 { params.Owners = o } } resp, err := conn.DescribeImages(params) if err != nil { return err } var filteredImages []*ec2.Image imageIds := make([]string, 0) if nameRegexOk { r := regexp.MustCompile(nameRegex.(string)) for _, image := range resp.Images { // Check for a very rare case where the response would include no // image name. No name means nothing to attempt a match against, // therefore we are skipping such image. if image.Name == nil || *image.Name == "" { log.Printf("[WARN] Unable to find AMI name to match against "+ "for image ID %q owned by %q, nothing to do.", *image.ImageId, *image.OwnerId) continue } if r.MatchString(*image.Name) { filteredImages = append(filteredImages, image) } } } else { filteredImages = resp.Images[:] } for _, image := range sortImages(filteredImages) { imageIds = append(imageIds, *image.ImageId) } d.SetId(fmt.Sprintf("%d", hashcode.String(params.String()))) d.Set("ids", imageIds) return nil }