diff --git a/.changelog/19868.txt b/.changelog/19868.txt new file mode 100644 index 000000000000..323a662a997b --- /dev/null +++ b/.changelog/19868.txt @@ -0,0 +1,3 @@ +```release-note:bug +resource/aws_lambda_provisioned_concurrency_config: Fix split of ARN:Qualifier +``` diff --git a/aws/resource_aws_lambda_provisioned_concurrency_config.go b/aws/resource_aws_lambda_provisioned_concurrency_config.go index b5ee216dd04f..1d8c1fb9613a 100644 --- a/aws/resource_aws_lambda_provisioned_concurrency_config.go +++ b/aws/resource_aws_lambda_provisioned_concurrency_config.go @@ -164,13 +164,20 @@ func resourceAwsLambdaProvisionedConcurrencyConfigDelete(d *schema.ResourceData, } func resourceAwsLambdaProvisionedConcurrencyConfigParseId(id string) (string, string, error) { - parts := strings.SplitN(id, ":", 2) + parts := strings.SplitN(id, ":", 8) - if len(parts) != 2 || parts[0] == "" || parts[1] == "" { - return "", "", fmt.Errorf("unexpected format of ID (%s), expected FUNCTION_NAME:QUALIFIER", id) + // functionname with qualifier + if len(parts) == 2 && parts[0] != "" && parts[1] != "" { + return parts[0], parts[1], nil } - return parts[0], parts[1], nil + // arn with qualifier + if len(parts) == 8 && parts[0] == "arn" && parts[1] == "aws" && parts[2] == "lambda" && parts[5] == "function" && + parts[6] != "" && parts[7] != "" { + return strings.Join(parts[0:7], ":"), parts[7], nil + } + + return "", "", fmt.Errorf("unexpected format of ID (%s), expected FUNCTION_NAME:QUALIFIER or ARN:QUALIFIER", id) } func refreshLambdaProvisionedConcurrencyConfigStatus(conn *lambda.Lambda, functionName, qualifier string) resource.StateRefreshFunc { diff --git a/aws/resource_aws_lambda_provisioned_concurrency_config_test.go b/aws/resource_aws_lambda_provisioned_concurrency_config_test.go index 002dddef34f0..682b8832b03a 100644 --- a/aws/resource_aws_lambda_provisioned_concurrency_config_test.go +++ b/aws/resource_aws_lambda_provisioned_concurrency_config_test.go @@ -151,6 +151,39 @@ func TestAccAWSLambdaProvisionedConcurrencyConfig_Qualifier_AliasName(t *testing }) } +func Test_resourceAwsLambdaProvisionedConcurrencyConfigParseId(t *testing.T) { + type args struct { + id string + } + tests := []struct { + name string + args args + want string + want1 string + wantErr bool + }{ + { "function with qualifier", args{ "my-function:alias" }, "my-function", "alias", false }, + { "function w/o qualifier", args{ "my-function" }, "", "", true }, + { "ARN with qualifier", args{ "arn:aws:lambda:nice-region:1234567890:function:my-function:alias" }, "arn:aws:lambda:nice-region:1234567890:function:my-function", "alias", false }, + { "ARN w/o qualifier", args{ "arn:aws:lambda:nice-region:1234567890:function:my-function" }, "", "", true }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1, err := resourceAwsLambdaProvisionedConcurrencyConfigParseId(tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("resourceAwsLambdaProvisionedConcurrencyConfigParseId() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("resourceAwsLambdaProvisionedConcurrencyConfigParseId() got = %v, want %v", got, tt.want) + } + if got1 != tt.want1 { + t.Errorf("resourceAwsLambdaProvisionedConcurrencyConfigParseId() got1 = %v, want %v", got1, tt.want1) + } + }) + } +} + func testAccCheckLambdaProvisionedConcurrencyConfigDestroy(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).lambdaconn