diff --git a/CHANGELOG.md b/CHANGELOG.md index df9701d78f3f..8640e4facdc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ BUG FIXES: * provider/aws: Ensure that origin_access_identity is a required value within the CloudFront distribution s3_config block [GH-8777] * provider/aws: Corrected Seoul S3 Website Endpoint format [GH-9032] * provider/aws: Fix failed remove S3 lifecycle_rule [GH-9031] + * provider/aws: Fix crashing bug in `aws_ami` data source when using `name_regex` [GH-9033] ## 0.7.4 (September 19, 2016) diff --git a/builtin/providers/aws/data_source_aws_ami.go b/builtin/providers/aws/data_source_aws_ami.go index 7bc1dcb020ef..778d3a2efe3c 100644 --- a/builtin/providers/aws/data_source_aws_ami.go +++ b/builtin/providers/aws/data_source_aws_ami.go @@ -236,10 +236,19 @@ func dataSourceAwsAmiRead(d *schema.ResourceData, meta interface{}) error { } var filteredImages []*ec2.Image - if nameRegexOk == true { + if nameRegexOk { r := regexp.MustCompile(nameRegex.(string)) for _, image := range resp.Images { - if r.MatchString(*image.Name) == true { + // 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) } } @@ -249,19 +258,23 @@ func dataSourceAwsAmiRead(d *schema.ResourceData, meta interface{}) error { var image *ec2.Image if len(filteredImages) < 1 { - return fmt.Errorf("Your query returned no results. Please change your filters and try again.") - } else if len(filteredImages) > 1 { - if (d.Get("most_recent").(bool)) == true { - log.Printf("[DEBUG] aws_ami - multiple results found and most_recent is set") + return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.") + } + + if len(filteredImages) > 1 { + recent := d.Get("most_recent").(bool) + log.Printf("[DEBUG] aws_ami - multiple results found and `most_recent` is set to: %t", recent) + if recent { image = mostRecentAmi(filteredImages) } else { - log.Printf("[DEBUG] aws_ami - multiple results found and most_recent not set") - return fmt.Errorf("Your query returned more than one result. Please try a more specific search, or set most_recent to true.") + return fmt.Errorf("Your query returned more than one result. Please try a more " + + "specific search criteria, or set `most_recent` attribute to true.") } - } else { - log.Printf("[DEBUG] aws_ami - Single AMI found: %s", *filteredImages[0].ImageId) - image = filteredImages[0] } + + image = filteredImages[0] + log.Printf("[DEBUG] aws_ami - Single AMI found: %s", *image.ImageId) + return amiDescriptionAttributes(d, image) }