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 == "" {