From 6c4fbe8d87a7b890c9b3d3a52d85deb63c18ecc1 Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Fri, 27 Oct 2017 09:58:13 -0700 Subject: [PATCH 1/5] use correct default region when deregistering AMIs. --- builder/amazon/common/step_deregister_ami.go | 95 ++++++++++---------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/builder/amazon/common/step_deregister_ami.go b/builder/amazon/common/step_deregister_ami.go index 3ad8711aa..da0bc0cc4 100644 --- a/builder/amazon/common/step_deregister_ami.go +++ b/builder/amazon/common/step_deregister_ami.go @@ -18,68 +18,71 @@ type StepDeregisterAMI struct { } func (s *StepDeregisterAMI) Run(state multistep.StateBag) multistep.StepAction { + // Check for force deregister + if !s.ForceDeregister { + return multistep.ActionContinue + } + ui := state.Get("ui").(packer.Ui) + ec2conn := state.Get("ec2").(*ec2.EC2) regions := s.Regions if len(regions) == 0 { - regions = append(regions, s.AccessConfig.RawRegion) + regions = append(regions, *ec2conn.Config.Region) } - // Check for force deregister - if s.ForceDeregister { - for _, region := range regions { - // get new connection for each region in which we need to deregister vms - session, err := s.AccessConfig.Session() - if err != nil { - return multistep.ActionHalt - } + for _, region := range regions { + // get new connection for each region in which we need to deregister vms + session, err := s.AccessConfig.Session() + if err != nil { + return multistep.ActionHalt + } + + regionconn := ec2.New(session.Copy(&aws.Config{ + Region: aws.String(region)}, + )) - regionconn := ec2.New(session.Copy(&aws.Config{ - Region: aws.String(region)}, - )) + resp, err := regionconn.DescribeImages(&ec2.DescribeImagesInput{ + Filters: []*ec2.Filter{{ + Name: aws.String("name"), + Values: []*string{aws.String(s.AMIName)}, + }}}) + + if err != nil { + err := fmt.Errorf("Error describing AMI: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } - resp, err := regionconn.DescribeImages(&ec2.DescribeImagesInput{ - Filters: []*ec2.Filter{{ - Name: aws.String("name"), - Values: []*string{aws.String(s.AMIName)}, - }}}) + // Deregister image(s) by name + for _, i := range resp.Images { + _, err := regionconn.DeregisterImage(&ec2.DeregisterImageInput{ + ImageId: i.ImageId, + }) if err != nil { - err := fmt.Errorf("Error describing AMI: %s", err) + err := fmt.Errorf("Error deregistering existing AMI: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } + ui.Say(fmt.Sprintf("Deregistered AMI %s, id: %s", s.AMIName, *i.ImageId)) - // Deregister image(s) by name - for _, i := range resp.Images { - _, err := regionconn.DeregisterImage(&ec2.DeregisterImageInput{ - ImageId: i.ImageId, - }) - - if err != nil { - err := fmt.Errorf("Error deregistering existing AMI: %s", err) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt - } - ui.Say(fmt.Sprintf("Deregistered AMI %s, id: %s", s.AMIName, *i.ImageId)) - - // Delete snapshot(s) by image - if s.ForceDeleteSnapshot { - for _, b := range i.BlockDeviceMappings { - if b.Ebs != nil && aws.StringValue(b.Ebs.SnapshotId) != "" { - _, err := regionconn.DeleteSnapshot(&ec2.DeleteSnapshotInput{ - SnapshotId: b.Ebs.SnapshotId, - }) + // Delete snapshot(s) by image + if s.ForceDeleteSnapshot { + for _, b := range i.BlockDeviceMappings { + if b.Ebs != nil && aws.StringValue(b.Ebs.SnapshotId) != "" { + _, err := regionconn.DeleteSnapshot(&ec2.DeleteSnapshotInput{ + SnapshotId: b.Ebs.SnapshotId, + }) - if err != nil { - err := fmt.Errorf("Error deleting existing snapshot: %s", err) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt - } - ui.Say(fmt.Sprintf("Deleted snapshot: %s", *b.Ebs.SnapshotId)) + if err != nil { + err := fmt.Errorf("Error deleting existing snapshot: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt } + ui.Say(fmt.Sprintf("Deleted snapshot: %s", *b.Ebs.SnapshotId)) } } } From c65fa8490dc668f5fda22fa273142baa489fd4c4 Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Mon, 30 Oct 2017 14:17:19 -0700 Subject: [PATCH 2/5] fix various bugs deregistering AMIs always deregister ami in session region validate that session region does not appear in ami_regions --- builder/amazon/chroot/builder.go | 3 ++- builder/amazon/common/access_config.go | 4 ++-- builder/amazon/common/ami_config.go | 14 ++++++++++++-- builder/amazon/common/step_deregister_ami.go | 6 ++---- builder/amazon/ebs/builder.go | 3 ++- builder/amazon/ebssurrogate/builder.go | 3 ++- builder/amazon/instance/builder.go | 3 ++- builder/amazon/instance/step_upload_bundle.go | 9 +-------- 8 files changed, 25 insertions(+), 20 deletions(-) diff --git a/builder/amazon/chroot/builder.go b/builder/amazon/chroot/builder.go index a259960d1..b6b5088a2 100644 --- a/builder/amazon/chroot/builder.go +++ b/builder/amazon/chroot/builder.go @@ -121,7 +121,8 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { var warns []string errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) - errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...) + errs = packer.MultiErrorAppend(errs, + b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...) for _, mounts := range b.config.ChrootMounts { if len(mounts) != 3 { diff --git a/builder/amazon/common/access_config.go b/builder/amazon/common/access_config.go index aa974f29c..59ef90c2b 100644 --- a/builder/amazon/common/access_config.go +++ b/builder/amazon/common/access_config.go @@ -32,7 +32,7 @@ func (c *AccessConfig) Session() (*session.Session, error) { return c.session, nil } - region, err := c.Region() + region, err := c.region() if err != nil { return nil, err } @@ -82,7 +82,7 @@ func (c *AccessConfig) Session() (*session.Session, error) { // Region returns the aws.Region object for access to AWS services, requesting // the region from the instance metadata if possible. -func (c *AccessConfig) Region() (string, error) { +func (c *AccessConfig) region() (string, error) { if c.RawRegion != "" { if !c.SkipValidation { if valid := ValidateRegion(c.RawRegion); !valid { diff --git a/builder/amazon/common/ami_config.go b/builder/amazon/common/ami_config.go index f59cb1d61..09b25479a 100644 --- a/builder/amazon/common/ami_config.go +++ b/builder/amazon/common/ami_config.go @@ -38,12 +38,23 @@ func stringInSlice(s []string, searchstr string) bool { return false } -func (c *AMIConfig) Prepare(ctx *interpolate.Context) []error { +func (c *AMIConfig) Prepare(accessConfig *AccessConfig, ctx *interpolate.Context) []error { var errs []error + + session, err := accessConfig.Session() + if err != nil { + errs = append(errs, err) + } + region := *session.Config.Region + if c.AMIName == "" { errs = append(errs, fmt.Errorf("ami_name must be specified")) } + if stringInSlice(c.AMIRegions, region) { + errs = append(errs, fmt.Errorf("Cannot copy AMI to AWS session region '%s', please remove it from `ami_regions`.", region)) + } + if len(c.AMIRegions) > 0 { regionSet := make(map[string]struct{}) regions := make([]string, 0, len(c.AMIRegions)) @@ -61,7 +72,6 @@ func (c *AMIConfig) Prepare(ctx *interpolate.Context) []error { // Verify the region is real if valid := ValidateRegion(region); !valid { errs = append(errs, fmt.Errorf("Unknown region: %s", region)) - continue } } diff --git a/builder/amazon/common/step_deregister_ami.go b/builder/amazon/common/step_deregister_ami.go index da0bc0cc4..188a40808 100644 --- a/builder/amazon/common/step_deregister_ami.go +++ b/builder/amazon/common/step_deregister_ami.go @@ -25,10 +25,8 @@ func (s *StepDeregisterAMI) Run(state multistep.StateBag) multistep.StepAction { ui := state.Get("ui").(packer.Ui) ec2conn := state.Get("ec2").(*ec2.EC2) - regions := s.Regions - if len(regions) == 0 { - regions = append(regions, *ec2conn.Config.Region) - } + // Add the session region to list of regions will will deregister AMIs in + regions := append(s.Regions, *ec2conn.Config.Region) for _, region := range regions { // get new connection for each region in which we need to deregister vms diff --git a/builder/amazon/ebs/builder.go b/builder/amazon/ebs/builder.go index beaa4a276..e28343c66 100644 --- a/builder/amazon/ebs/builder.go +++ b/builder/amazon/ebs/builder.go @@ -64,8 +64,9 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { // Accumulate any errors var errs *packer.MultiError errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) + errs = packer.MultiErrorAppend(errs, + b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...) - errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...) if errs != nil && len(errs.Errors) > 0 { diff --git a/builder/amazon/ebssurrogate/builder.go b/builder/amazon/ebssurrogate/builder.go index f61b2d43e..71fdb2c9d 100644 --- a/builder/amazon/ebssurrogate/builder.go +++ b/builder/amazon/ebssurrogate/builder.go @@ -64,7 +64,8 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { var errs *packer.MultiError errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...) - errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...) + errs = packer.MultiErrorAppend(errs, + b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RootDevice.Prepare(&b.config.ctx)...) diff --git a/builder/amazon/instance/builder.go b/builder/amazon/instance/builder.go index ebc93751e..9500867ef 100644 --- a/builder/amazon/instance/builder.go +++ b/builder/amazon/instance/builder.go @@ -127,7 +127,8 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { var errs *packer.MultiError errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...) - errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...) + errs = packer.MultiErrorAppend(errs, + b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...) if b.config.AccountId == "" { diff --git a/builder/amazon/instance/step_upload_bundle.go b/builder/amazon/instance/step_upload_bundle.go index 91abfc9b6..a38a77c93 100644 --- a/builder/amazon/instance/step_upload_bundle.go +++ b/builder/amazon/instance/step_upload_bundle.go @@ -29,17 +29,10 @@ func (s *StepUploadBundle) Run(state multistep.StateBag) multistep.StepAction { manifestPath := state.Get("manifest_path").(string) ui := state.Get("ui").(packer.Ui) - region, err := config.Region() - if err != nil { - err := fmt.Errorf("Error retrieving region: %s", err) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt - } - accessKey := config.AccessKey secretKey := config.SecretKey session, err := config.AccessConfig.Session() + region := *session.Config.Region accessConfig := session.Config var token string if err == nil && accessKey == "" && secretKey == "" { From 0e4ea7420b2ca7cdbbd2feb0c1cdc3486110c273 Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Mon, 30 Oct 2017 14:34:16 -0700 Subject: [PATCH 3/5] fix tests --- builder/amazon/common/access_config.go | 3 +- builder/amazon/common/ami_config.go | 17 +++++----- builder/amazon/common/ami_config_test.go | 40 ++++++++++++------------ 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/builder/amazon/common/access_config.go b/builder/amazon/common/access_config.go index 59ef90c2b..bf295e535 100644 --- a/builder/amazon/common/access_config.go +++ b/builder/amazon/common/access_config.go @@ -80,8 +80,7 @@ func (c *AccessConfig) Session() (*session.Session, error) { return c.session, nil } -// Region returns the aws.Region object for access to AWS services, requesting -// the region from the instance metadata if possible. +// region returns either the region from config or region from metadata service func (c *AccessConfig) region() (string, error) { if c.RawRegion != "" { if !c.SkipValidation { diff --git a/builder/amazon/common/ami_config.go b/builder/amazon/common/ami_config.go index 09b25479a..7dfe1af88 100644 --- a/builder/amazon/common/ami_config.go +++ b/builder/amazon/common/ami_config.go @@ -41,20 +41,21 @@ func stringInSlice(s []string, searchstr string) bool { func (c *AMIConfig) Prepare(accessConfig *AccessConfig, ctx *interpolate.Context) []error { var errs []error - session, err := accessConfig.Session() - if err != nil { - errs = append(errs, err) + if accessConfig != nil { + session, err := accessConfig.Session() + if err != nil { + errs = append(errs, err) + } + region := *session.Config.Region + if stringInSlice(c.AMIRegions, region) { + errs = append(errs, fmt.Errorf("Cannot copy AMI to AWS session region '%s', please remove it from `ami_regions`.", region)) + } } - region := *session.Config.Region if c.AMIName == "" { errs = append(errs, fmt.Errorf("ami_name must be specified")) } - if stringInSlice(c.AMIRegions, region) { - errs = append(errs, fmt.Errorf("Cannot copy AMI to AWS session region '%s', please remove it from `ami_regions`.", region)) - } - if len(c.AMIRegions) > 0 { regionSet := make(map[string]struct{}) regions := make([]string, 0, len(c.AMIRegions)) diff --git a/builder/amazon/common/ami_config_test.go b/builder/amazon/common/ami_config_test.go index faa67c56d..5f130130c 100644 --- a/builder/amazon/common/ami_config_test.go +++ b/builder/amazon/common/ami_config_test.go @@ -13,12 +13,12 @@ func testAMIConfig() *AMIConfig { func TestAMIConfigPrepare_name(t *testing.T) { c := testAMIConfig() - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatalf("shouldn't have err: %s", err) } c.AMIName = "" - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("should have error") } } @@ -26,22 +26,22 @@ func TestAMIConfigPrepare_name(t *testing.T) { func TestAMIConfigPrepare_regions(t *testing.T) { c := testAMIConfig() c.AMIRegions = nil - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatalf("shouldn't have err: %s", err) } c.AMIRegions = listEC2Regions() - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatalf("shouldn't have err: %s", err) } c.AMIRegions = []string{"foo"} - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("should have error") } c.AMIRegions = []string{"us-east-1", "us-west-1", "us-east-1"} - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatalf("bad: %s", err) } @@ -52,7 +52,7 @@ func TestAMIConfigPrepare_regions(t *testing.T) { c.AMIRegions = []string{"custom"} c.AMISkipRegionValidation = true - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatal("shouldn't have error") } c.AMISkipRegionValidation = false @@ -63,7 +63,7 @@ func TestAMIConfigPrepare_regions(t *testing.T) { "us-west-1": "789-012-3456", "us-east-2": "456-789-0123", } - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatal("shouldn't have error") } @@ -73,7 +73,7 @@ func TestAMIConfigPrepare_regions(t *testing.T) { "us-west-1": "789-012-3456", "us-east-2": "", } - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatal("should have passed; we are able to use default KMS key if not sharing") } @@ -84,7 +84,7 @@ func TestAMIConfigPrepare_regions(t *testing.T) { "us-west-1": "789-012-3456", "us-east-2": "", } - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("should have an error b/c can't use default KMS key if sharing") } @@ -94,7 +94,7 @@ func TestAMIConfigPrepare_regions(t *testing.T) { "us-west-1": "789-012-3456", "us-east-2": "456-789-0123", } - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("should have error b/c theres a region in the key map that isn't in ami_regions") } @@ -103,7 +103,7 @@ func TestAMIConfigPrepare_regions(t *testing.T) { "us-east-1": "123-456-7890", "us-west-1": "789-012-3456", } - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("should have error b/c theres a region in in ami_regions that isn't in the key map") } @@ -115,7 +115,7 @@ func TestAMIConfigPrepare_regions(t *testing.T) { "us-east-1": "123-456-7890", "us-west-1": "", } - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("should have error b/c theres a region in in ami_regions that isn't in the key map") } } @@ -126,12 +126,12 @@ func TestAMIConfigPrepare_Share_EncryptedBoot(t *testing.T) { c.AMIEncryptBootVolume = true c.AMIKmsKeyId = "" - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("shouldn't be able to share ami with encrypted boot volume") } c.AMIKmsKeyId = "89c3fb9a-de87-4f2a-aedc-fddc5138193c" - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("shouldn't be able to share ami with encrypted boot volume") } } @@ -140,7 +140,7 @@ func TestAMINameValidation(t *testing.T) { c := testAMIConfig() c.AMIName = "aa" - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("shouldn't be able to have an ami name with less than 3 characters") } @@ -149,22 +149,22 @@ func TestAMINameValidation(t *testing.T) { longAmiName += "a" } c.AMIName = longAmiName - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("shouldn't be able to have an ami name with great than 128 characters") } c.AMIName = "+aaa" - if err := c.Prepare(nil); err == nil { + if err := c.Prepare(nil, nil); err == nil { t.Fatal("shouldn't be able to have an ami name with invalid characters") } c.AMIName = "fooBAR1()[] ./-'@_" - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatal("should be able to use all of the allowed AMI characters") } c.AMIName = `xyz-base-2017-04-05-1934` - if err := c.Prepare(nil); err != nil { + if err := c.Prepare(nil, nil); err != nil { t.Fatalf("expected `xyz-base-2017-04-05-1934` to pass validation.") } From 314fc94bd837d8f7a810e84a9854fe94c50ed18a Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Mon, 30 Oct 2017 15:02:39 -0700 Subject: [PATCH 4/5] clean up --- builder/amazon/common/access_config.go | 27 +++++++++++--------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/builder/amazon/common/access_config.go b/builder/amazon/common/access_config.go index bf295e535..c692937a0 100644 --- a/builder/amazon/common/access_config.go +++ b/builder/amazon/common/access_config.go @@ -32,18 +32,17 @@ func (c *AccessConfig) Session() (*session.Session, error) { return c.session, nil } - region, err := c.region() - if err != nil { - return nil, err - } - if c.ProfileName != "" { if err := os.Setenv("AWS_PROFILE", c.ProfileName); err != nil { log.Printf("Set env error: %s", err) } } - config := aws.NewConfig().WithRegion(region).WithMaxRetries(11).WithCredentialsChainVerboseErrors(true) + config := aws.NewConfig().WithMaxRetries(11).WithCredentialsChainVerboseErrors(true) + + if region := c.region(); region != "" { + config = config.WithRegion(region) + } if c.CustomEndpointEc2 != "" { config = config.WithEndpoint(c.CustomEndpointEc2) @@ -72,6 +71,7 @@ func (c *AccessConfig) Session() (*session.Session, error) { return c.MFACode, nil } } + var err error c.session, err = session.NewSessionWithOptions(opts) if err != nil { return nil, err @@ -81,25 +81,20 @@ func (c *AccessConfig) Session() (*session.Session, error) { } // region returns either the region from config or region from metadata service -func (c *AccessConfig) region() (string, error) { +func (c *AccessConfig) region() string { if c.RawRegion != "" { - if !c.SkipValidation { - if valid := ValidateRegion(c.RawRegion); !valid { - return "", fmt.Errorf("Not a valid region: %s", c.RawRegion) - } - } - return c.RawRegion, nil + return c.RawRegion } sess := session.New() ec2meta := ec2metadata.New(sess) - identity, err := ec2meta.GetInstanceIdentityDocument() + region, err := ec2meta.Region() if err != nil { log.Println("Error getting region from metadata service, "+ "probably because we're not running on AWS.", err) - return "", nil + return "" } - return identity.Region, nil + return region } func (c *AccessConfig) Prepare(ctx *interpolate.Context) []error { From d322fc6c192a73de4eb37c79a2b208bd798adc20 Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Mon, 30 Oct 2017 15:14:42 -0700 Subject: [PATCH 5/5] Shorten metadata timeout When running in travis, metadata requests will timeout after 5 seconds. After 24 such timeouts, we'll hit travis' build timeout of two minutes, and the build will fail. Lowering it to 100 gets us in a safe time limit. We _may_ need to expose a timeout env var with this logic, however. --- builder/amazon/common/access_config.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/builder/amazon/common/access_config.go b/builder/amazon/common/access_config.go index c692937a0..03deca8bf 100644 --- a/builder/amazon/common/access_config.go +++ b/builder/amazon/common/access_config.go @@ -4,11 +4,13 @@ import ( "fmt" "log" "os" + "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/ec2metadata" "github.com/aws/aws-sdk-go/aws/session" + "github.com/hashicorp/go-cleanhttp" "github.com/hashicorp/packer/template/interpolate" ) @@ -86,8 +88,13 @@ func (c *AccessConfig) region() string { return c.RawRegion } - sess := session.New() - ec2meta := ec2metadata.New(sess) + client := cleanhttp.DefaultClient() + + // Keep the default timeout (100ms) low as we don't want to wait in non-EC2 environments + client.Timeout = 100 * time.Millisecond + ec2meta := ec2metadata.New(session.New(), &aws.Config{ + HTTPClient: client, + }) region, err := ec2meta.Region() if err != nil { log.Println("Error getting region from metadata service, "+