Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

r/aws_lambda_provisioned_concurrency_config: Use comma-delimited id #31933

Merged
merged 3 commits into from
Jun 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/31933.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/aws_lambda_provisioned_concurrency_config: The `function_name` argument now properly handles ARN values
```
53 changes: 32 additions & 21 deletions internal/service/lambda/provisioned_concurrency_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"context"
"fmt"
"log"
"strings"
"time"

"github.com/aws/aws-sdk-go/aws"
Expand All @@ -16,6 +15,7 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/hashicorp/terraform-provider-aws/internal/conns"
"github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag"
"github.com/hashicorp/terraform-provider-aws/internal/flex"
)

// @SDKResource("aws_lambda_provisioned_concurrency_config")
Expand All @@ -25,14 +25,25 @@ func ResourceProvisionedConcurrencyConfig() *schema.Resource {
ReadWithoutTimeout: resourceProvisionedConcurrencyConfigRead,
UpdateWithoutTimeout: resourceProvisionedConcurrencyConfigUpdate,
DeleteWithoutTimeout: resourceProvisionedConcurrencyConfigDelete,

Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(15 * time.Minute),
Update: schema.DefaultTimeout(15 * time.Minute),
},

SchemaVersion: 1,
StateUpgraders: []schema.StateUpgrader{
{
Type: resourceProvisionedConcurrencyConfigV0().CoreConfigSchema().ImpliedType(),
Upgrade: provisionedConcurrencyConfigStateUpgradeV0,
Version: 0,
},
},

Schema: map[string]*schema.Schema{
"function_name": {
Type: schema.TypeString,
Expand Down Expand Up @@ -60,6 +71,10 @@ func ResourceProvisionedConcurrencyConfig() *schema.Resource {
}
}

const (
ProvisionedConcurrencyIDPartCount = 2
)

func resourceProvisionedConcurrencyConfigCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).LambdaConn(ctx)
Expand All @@ -75,10 +90,15 @@ func resourceProvisionedConcurrencyConfigCreate(ctx context.Context, d *schema.R
_, err := conn.PutProvisionedConcurrencyConfigWithContext(ctx, input)

if err != nil {
return sdkdiag.AppendErrorf(diags, "putting Lambda Provisioned Concurrency Config (%s:%s): %s", functionName, qualifier, err)
return sdkdiag.AppendErrorf(diags, "putting Lambda Provisioned Concurrency Config (%s,%s): %s", functionName, qualifier, err)
}

d.SetId(fmt.Sprintf("%s:%s", functionName, qualifier))
parts := []string{functionName, qualifier}
id, err := flex.FlattenResourceId(parts, ProvisionedConcurrencyIDPartCount, false)
if err != nil {
return sdkdiag.AppendErrorf(diags, "setting Lambda Provisioned Concurrency Config ID (%s,%s): %s", functionName, qualifier, err)
}
d.SetId(id)

if err := waitForProvisionedConcurrencyConfigStatusReady(ctx, conn, functionName, qualifier, d.Timeout(schema.TimeoutCreate)); err != nil {
return sdkdiag.AppendErrorf(diags, "waiting for Lambda Provisioned Concurrency Config (%s) to be ready: %s", d.Id(), err)
Expand All @@ -91,11 +111,12 @@ func resourceProvisionedConcurrencyConfigRead(ctx context.Context, d *schema.Res
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).LambdaConn(ctx)

functionName, qualifier, err := ProvisionedConcurrencyConfigParseID(d.Id())

parts, err := flex.ExpandResourceId(d.Id(), ProvisionedConcurrencyIDPartCount, false)
if err != nil {
return sdkdiag.AppendErrorf(diags, "reading Lambda Provisioned Concurrency Config (%s): %s", d.Id(), err)
}
functionName := parts[0]
qualifier := parts[1]

input := &lambda.GetProvisionedConcurrencyConfigInput{
FunctionName: aws.String(functionName),
Expand Down Expand Up @@ -125,11 +146,12 @@ func resourceProvisionedConcurrencyConfigUpdate(ctx context.Context, d *schema.R
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).LambdaConn(ctx)

functionName, qualifier, err := ProvisionedConcurrencyConfigParseID(d.Id())

parts, err := flex.ExpandResourceId(d.Id(), ProvisionedConcurrencyIDPartCount, false)
if err != nil {
return sdkdiag.AppendErrorf(diags, "updating Lambda Provisioned Concurrency Config (%s): %s", d.Id(), err)
}
functionName := parts[0]
qualifier := parts[1]

input := &lambda.PutProvisionedConcurrencyConfigInput{
FunctionName: aws.String(functionName),
Expand Down Expand Up @@ -159,15 +181,14 @@ func resourceProvisionedConcurrencyConfigDelete(ctx context.Context, d *schema.R

conn := meta.(*conns.AWSClient).LambdaConn(ctx)

functionName, qualifier, err := ProvisionedConcurrencyConfigParseID(d.Id())

parts, err := flex.ExpandResourceId(d.Id(), ProvisionedConcurrencyIDPartCount, false)
if err != nil {
return sdkdiag.AppendErrorf(diags, "deleting Lambda Provisioned Concurrency Config (%s): %s", d.Id(), err)
}

input := &lambda.DeleteProvisionedConcurrencyConfigInput{
FunctionName: aws.String(functionName),
Qualifier: aws.String(qualifier),
FunctionName: aws.String(parts[0]),
Qualifier: aws.String(parts[1]),
}

_, err = conn.DeleteProvisionedConcurrencyConfigWithContext(ctx, input)
Expand All @@ -183,16 +204,6 @@ func resourceProvisionedConcurrencyConfigDelete(ctx context.Context, d *schema.R
return diags
}

func ProvisionedConcurrencyConfigParseID(id string) (string, string, error) {
parts := strings.SplitN(id, ":", 2)

if len(parts) != 2 || parts[0] == "" || parts[1] == "" {
return "", "", fmt.Errorf("unexpected format of ID (%s), expected FUNCTION_NAME:QUALIFIER", id)
}

return parts[0], parts[1], nil
}

func refreshProvisionedConcurrencyConfigStatus(ctx context.Context, conn *lambda.Lambda, functionName, qualifier string) retry.StateRefreshFunc {
return func() (interface{}, string, error) {
input := &lambda.GetProvisionedConcurrencyConfigInput{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package lambda

import (
"context"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/hashicorp/terraform-provider-aws/internal/flex"
)

func resourceProvisionedConcurrencyConfigV0() *schema.Resource {
// Resource with v0 schema (provider v5.3.0 and below)
return &schema.Resource{
Schema: map[string]*schema.Schema{
"function_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.NoZeroValues,
},
"provisioned_concurrent_executions": {
Type: schema.TypeInt,
Required: true,
ValidateFunc: validation.IntAtLeast(1),
},
"qualifier": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.NoZeroValues,
},
"skip_destroy": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
},
}
}

func provisionedConcurrencyConfigStateUpgradeV0(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) {
if rawState == nil {
rawState = map[string]interface{}{}
}

// Convert id separator from ":" to ","
parts := []string{
rawState["function_name"].(string),
rawState["qualifier"].(string),
}

id, err := flex.FlattenResourceId(parts, ProvisionedConcurrencyIDPartCount, false)
if err != nil {
return rawState, err
}
rawState["id"] = id

return rawState, nil
}
Loading