func resourceAwsSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn sgRaw, _, err := SGStateRefreshFunc(conn, d.Id())() if err != nil { return err } if sgRaw == nil { d.SetId("") return nil } group := sgRaw.(*ec2.SecurityGroup) err = resourceAwsSecurityGroupUpdateRules(d, "ingress", meta, group) if err != nil { return err } if d.Get("vpc_id") != nil { err = resourceAwsSecurityGroupUpdateRules(d, "egress", meta, group) if err != nil { return err } } if !d.IsNewResource() { if err := setTags(conn, d); err != nil { return err } d.SetPartial("tags") } return resourceAwsSecurityGroupRead(d, meta) }
func (it *integrationType) prepareForJSON(d *schema.ResourceData) map[string]interface{} { ret := map[string]interface{}{} ret["type"] = it.Name isNew := d.IsNewResource() for k, s := range it.Attributes { if isNew || d.HasChange(k) { ret[k] = prepareForJSON(s, d.Get(k)) } } return map[string]interface{}{ "integration": ret, } }
func resourceAwsAlbUpdate(d *schema.ResourceData, meta interface{}) error { elbconn := meta.(*AWSClient).elbv2conn if !d.IsNewResource() { if err := setElbV2Tags(elbconn, d); err != nil { return errwrap.Wrapf("Error Modifying Tags on ALB: {{err}}", err) } } attributes := make([]*elbv2.LoadBalancerAttribute, 0) if d.HasChange("access_logs") { logs := d.Get("access_logs").([]interface{}) if len(logs) == 1 { log := logs[0].(map[string]interface{}) attributes = append(attributes, &elbv2.LoadBalancerAttribute{ Key: aws.String("access_logs.s3.enabled"), Value: aws.String("true"), }, &elbv2.LoadBalancerAttribute{ Key: aws.String("access_logs.s3.bucket"), Value: aws.String(log["bucket"].(string)), }) if prefix, ok := log["prefix"]; ok { attributes = append(attributes, &elbv2.LoadBalancerAttribute{ Key: aws.String("access_logs.s3.prefix"), Value: aws.String(prefix.(string)), }) } } else if len(logs) == 0 { attributes = append(attributes, &elbv2.LoadBalancerAttribute{ Key: aws.String("access_logs.s3.enabled"), Value: aws.String("false"), }) } } if d.HasChange("enable_deletion_protection") { attributes = append(attributes, &elbv2.LoadBalancerAttribute{ Key: aws.String("deletion_protection.enabled"), Value: aws.String(fmt.Sprintf("%t", d.Get("enable_deletion_protection").(bool))), }) } if d.HasChange("idle_timeout") { attributes = append(attributes, &elbv2.LoadBalancerAttribute{ Key: aws.String("idle_timeout.timeout_seconds"), Value: aws.String(fmt.Sprintf("%d", d.Get("idle_timeout").(int))), }) } if len(attributes) != 0 { input := &elbv2.ModifyLoadBalancerAttributesInput{ LoadBalancerArn: aws.String(d.Id()), Attributes: attributes, } log.Printf("[DEBUG] ALB Modify Load Balancer Attributes Request: %#v", input) _, err := elbconn.ModifyLoadBalancerAttributes(input) if err != nil { return fmt.Errorf("Failure configuring ALB attributes: %s", err) } } return resourceAwsAlbRead(d, meta) }
// resourceAwsLambdaFunctionRead maps to: // GetFunction in the API / SDK func resourceAwsLambdaFunctionRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).lambdaconn log.Printf("[DEBUG] Fetching Lambda Function: %s", d.Id()) params := &lambda.GetFunctionInput{ FunctionName: aws.String(d.Get("function_name").(string)), } getFunctionOutput, err := conn.GetFunction(params) if err != nil { if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "ResourceNotFoundException" && !d.IsNewResource() { d.SetId("") return nil } return err } // getFunctionOutput.Code.Location is a pre-signed URL pointing at the zip // file that we uploaded when we created the resource. You can use it to // download the code from AWS. The other part is // getFunctionOutput.Configuration which holds metadata. function := getFunctionOutput.Configuration // TODO error checking / handling on the Set() calls. d.Set("arn", function.FunctionArn) d.Set("description", function.Description) d.Set("handler", function.Handler) d.Set("memory_size", function.MemorySize) d.Set("last_modified", function.LastModified) d.Set("role", function.Role) d.Set("runtime", function.Runtime) d.Set("timeout", function.Timeout) d.Set("kms_key_arn", function.KMSKeyArn) config := flattenLambdaVpcConfigResponse(function.VpcConfig) log.Printf("[INFO] Setting Lambda %s VPC config %#v from API", d.Id(), config) vpcSetErr := d.Set("vpc_config", config) if vpcSetErr != nil { return fmt.Errorf("Failed setting vpc_config: %s", vpcSetErr) } d.Set("source_code_hash", function.CodeSha256) if err := d.Set("environment", flattenLambdaEnvironment(function.Environment)); err != nil { log.Printf("[ERR] Error setting environment for Lambda Function (%s): %s", d.Id(), err) } // List is sorted from oldest to latest // so this may get costly over time :'( var lastVersion, lastQualifiedArn string err = listVersionsByFunctionPages(conn, &lambda.ListVersionsByFunctionInput{ FunctionName: function.FunctionName, MaxItems: aws.Int64(10000), }, func(p *lambda.ListVersionsByFunctionOutput, lastPage bool) bool { if lastPage { last := p.Versions[len(p.Versions)-1] lastVersion = *last.Version lastQualifiedArn = *last.FunctionArn return true } return false }) if err != nil { return err } d.Set("version", lastVersion) d.Set("qualified_arn", lastQualifiedArn) return nil }
// resourceAwsLambdaFunctionRead maps to: // GetFunction in the API / SDK func resourceAwsLambdaFunctionRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).lambdaconn log.Printf("[DEBUG] Fetching Lambda Function: %s", d.Id()) params := &lambda.GetFunctionInput{ FunctionName: aws.String(d.Get("function_name").(string)), } getFunctionOutput, err := conn.GetFunction(params) if err != nil { if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "ResourceNotFoundException" && !d.IsNewResource() { d.SetId("") return nil } return err } // getFunctionOutput.Code.Location is a pre-signed URL pointing at the zip // file that we uploaded when we created the resource. You can use it to // download the code from AWS. The other part is // getFunctionOutput.Configuration which holds metadata. function := getFunctionOutput.Configuration // TODO error checking / handling on the Set() calls. d.Set("arn", function.FunctionArn) d.Set("description", function.Description) d.Set("handler", function.Handler) d.Set("memory_size", function.MemorySize) d.Set("last_modified", function.LastModified) d.Set("role", function.Role) d.Set("runtime", function.Runtime) d.Set("timeout", function.Timeout) if config := flattenLambdaVpcConfigResponse(function.VpcConfig); len(config) > 0 { log.Printf("[INFO] Setting Lambda %s VPC config %#v from API", d.Id(), config) err := d.Set("vpc_config", config) if err != nil { return fmt.Errorf("Failed setting vpc_config: %s", err) } } d.Set("source_code_hash", function.CodeSha256) return nil }
func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn d.Partial(true) if err := setTags(conn, d); err != nil { return err } else { d.SetPartial("tags") } if d.HasChange("source_dest_check") || d.IsNewResource() { // SourceDestCheck can only be set on VPC instances // AWS will return an error of InvalidParameterCombination if we attempt // to modify the source_dest_check of an instance in EC2 Classic log.Printf("[INFO] Modifying `source_dest_check` on Instance %s", d.Id()) _, err := conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeInput{ InstanceId: aws.String(d.Id()), SourceDestCheck: &ec2.AttributeBooleanValue{ Value: aws.Bool(d.Get("source_dest_check").(bool)), }, }) if err != nil { if ec2err, ok := err.(awserr.Error); ok { // Toloerate InvalidParameterCombination error in Classic, otherwise // return the error if "InvalidParameterCombination" != ec2err.Code() { return err } log.Printf("[WARN] Attempted to modify SourceDestCheck on non VPC instance: %s", ec2err.Message()) } } } if d.HasChange("vpc_security_group_ids") { var groups []*string if v := d.Get("vpc_security_group_ids").(*schema.Set); v.Len() > 0 { for _, v := range v.List() { groups = append(groups, aws.String(v.(string))) } } _, err := conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeInput{ InstanceId: aws.String(d.Id()), Groups: groups, }) if err != nil { return err } } if d.HasChange("disable_api_termination") { _, err := conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeInput{ InstanceId: aws.String(d.Id()), DisableApiTermination: &ec2.AttributeBooleanValue{ Value: aws.Bool(d.Get("disable_api_termination").(bool)), }, }) if err != nil { return err } } if d.HasChange("instance_initiated_shutdown_behavior") { log.Printf("[INFO] Modifying instance %s", d.Id()) _, err := conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeInput{ InstanceId: aws.String(d.Id()), InstanceInitiatedShutdownBehavior: &ec2.AttributeValue{ Value: aws.String(d.Get("instance_initiated_shutdown_behavior").(string)), }, }) if err != nil { return err } } if d.HasChange("monitoring") { var mErr error if d.Get("monitoring").(bool) { log.Printf("[DEBUG] Enabling monitoring for Instance (%s)", d.Id()) _, mErr = conn.MonitorInstances(&ec2.MonitorInstancesInput{ InstanceIds: []*string{aws.String(d.Id())}, }) } else { log.Printf("[DEBUG] Disabling monitoring for Instance (%s)", d.Id()) _, mErr = conn.UnmonitorInstances(&ec2.UnmonitorInstancesInput{ InstanceIds: []*string{aws.String(d.Id())}, }) } if mErr != nil { return fmt.Errorf("[WARN] Error updating Instance monitoring: %s", mErr) } } // TODO(mitchellh): wait for the attributes we modified to // persist the change... d.Partial(false) return resourceAwsInstanceRead(d, meta) }