Skip to content

Commit 5c88a0e

Browse files
authored
Merge pull request #17180 from hashicorp/b-lambda-function-data-source-container-img
d/aws_lambda_function: prevent read error when fetching code signing config for "Image" package type
2 parents f28b7ab + 1abeba0 commit 5c88a0e

3 files changed

Lines changed: 69 additions & 13 deletions

File tree

aws/data_source_aws_lambda_function.go

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -313,23 +313,26 @@ func dataSourceAwsLambdaFunctionRead(d *schema.ResourceData, meta interface{}) e
313313
return nil
314314
}
315315

316-
// Get Code Signing Config Output
317-
// If code signing config output exists, set it to that value, otherwise set it empty.
318-
codeSigningConfigInput := &lambda.GetFunctionCodeSigningConfigInput{
319-
FunctionName: aws.String(d.Get("function_name").(string)),
320-
}
316+
// Get Code Signing Config Output.
317+
// Code Signing is only supported on zip packaged lambda functions.
318+
var codeSigningConfigArn string
321319

322-
getCodeSigningConfigOutput, err := conn.GetFunctionCodeSigningConfig(codeSigningConfigInput)
323-
if err != nil {
324-
return fmt.Errorf("error getting Lambda Function (%s) Code Signing Config: %w", aws.StringValue(function.FunctionName), err)
325-
}
320+
if aws.StringValue(function.PackageType) == lambda.PackageTypeZip {
321+
codeSigningConfigInput := &lambda.GetFunctionCodeSigningConfigInput{
322+
FunctionName: function.FunctionName,
323+
}
324+
getCodeSigningConfigOutput, err := conn.GetFunctionCodeSigningConfig(codeSigningConfigInput)
325+
if err != nil {
326+
return fmt.Errorf("error getting Lambda Function (%s) Code Signing Config: %w", aws.StringValue(function.FunctionName), err)
327+
}
326328

327-
if getCodeSigningConfigOutput == nil || getCodeSigningConfigOutput.CodeSigningConfigArn == nil {
328-
d.Set("code_signing_config_arn", "")
329-
} else {
330-
d.Set("code_signing_config_arn", getCodeSigningConfigOutput.CodeSigningConfigArn)
329+
if getCodeSigningConfigOutput != nil {
330+
codeSigningConfigArn = aws.StringValue(getCodeSigningConfigOutput.CodeSigningConfigArn)
331+
}
331332
}
332333

334+
d.Set("code_signing_config_arn", codeSigningConfigArn)
335+
333336
d.SetId(aws.StringValue(function.FunctionName))
334337

335338
return nil

aws/data_source_aws_lambda_function_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package aws
22

33
import (
44
"fmt"
5+
"os"
56
"testing"
67

78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
@@ -180,6 +181,27 @@ func TestAccDataSourceAWSLambdaFunction_fileSystemConfig(t *testing.T) {
180181
})
181182
}
182183

184+
func TestAccDataSourceAWSLambdaFunction_imageConfig(t *testing.T) {
185+
rName := acctest.RandomWithPrefix("tf-acc-test")
186+
dataSourceName := "data.aws_lambda_function.test"
187+
resourceName := "aws_lambda_function.test"
188+
189+
imageLatestID := os.Getenv("AWS_LAMBDA_IMAGE_LATEST_ID")
190+
191+
resource.ParallelTest(t, resource.TestCase{
192+
PreCheck: func() { testAccPreCheck(t); testAccDataSourceLambdaImagePreCheck(t) },
193+
Providers: testAccProviders,
194+
Steps: []resource.TestStep{
195+
{
196+
Config: testAccDataSourceAWSLambdaFunctionConfigImageConfig(rName, imageLatestID),
197+
Check: resource.ComposeTestCheckFunc(
198+
resource.TestCheckResourceAttrPair(dataSourceName, "code_signing_config_arn", resourceName, "code_signing_config_arn"),
199+
),
200+
},
201+
},
202+
})
203+
}
204+
183205
func testAccDataSourceAWSLambdaFunctionConfigBase(rName string) string {
184206
return fmt.Sprintf(`
185207
resource "aws_iam_role" "lambda" {
@@ -495,3 +517,31 @@ data "aws_lambda_function" "test" {
495517
}
496518
`, rName)
497519
}
520+
521+
func testAccDataSourceAWSLambdaFunctionConfigImageConfig(rName, imageID string) string {
522+
return composeConfig(
523+
testAccDataSourceAWSLambdaFunctionConfigBase(rName),
524+
fmt.Sprintf(`
525+
resource "aws_lambda_function" "test" {
526+
image_uri = %q
527+
function_name = %q
528+
role = aws_iam_role.lambda.arn
529+
package_type = "Image"
530+
image_config {
531+
entry_point = ["/bootstrap-with-handler"]
532+
command = ["app.lambda_handler"]
533+
working_directory = "/var/task"
534+
}
535+
}
536+
537+
data "aws_lambda_function" "test" {
538+
function_name = aws_lambda_function.test.function_name
539+
}
540+
`, imageID, rName))
541+
}
542+
543+
func testAccDataSourceLambdaImagePreCheck(t *testing.T) {
544+
if os.Getenv("AWS_LAMBDA_IMAGE_LATEST_ID") == "" {
545+
t.Skip("AWS_LAMBDA_IMAGE_LATEST_ID env var must be set for Lambda Function Data Source Image Support acceptance tests.")
546+
}
547+
}

docs/MAINTAINING.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,9 @@ Environment variables (beyond standard AWS Go SDK ones) used by acceptance testi
404404
| `AWS_EC2_EIP_PUBLIC_IPV4_POOL` | Identifier for EC2 Public IPv4 Pool for EC2 EIP testing. |
405405
| `AWS_GUARDDUTY_MEMBER_ACCOUNT_ID` | Identifier of AWS Account for GuardDuty Member testing. **DEPRECATED:** Should be replaced with standard alternate account handling for tests. |
406406
| `AWS_GUARDDUTY_MEMBER_EMAIL` | Email address for GuardDuty Member testing. **DEPRECATED:** It may be possible to use a placeholder email address instead. |
407+
| `AWS_LAMBDA_IMAGE_LATEST_ID` | ECR repository image URI (tagged as `latest`) for Lambda container image acceptance tests.
408+
| `AWS_LAMBDA_IMAGE_V1_ID` | ECR repository image URI (tagged as `v1`) for Lambda container image acceptance tests.
409+
| `AWS_LAMBDA_IMAGE_V2_ID` | ECR repository image URI (tagged as `v2`) for Lambda container image acceptance tests.
407410
| `DX_CONNECTION_ID` | Identifier for Direct Connect Connection testing. |
408411
| `DX_VIRTUAL_INTERFACE_ID` | Identifier for Direct Connect Virtual Interface testing. |
409412
| `EC2_SECURITY_GROUP_RULES_PER_GROUP_LIMIT` | EC2 Quota for Rules per Security Group. Defaults to 50. **DEPRECATED:** Can be augmented or replaced with Service Quotas lookup. |

0 commit comments

Comments
 (0)