github.com/cbroglie/terraform@v0.7.0-rc3.0.20170410193827-735dfc416d46/builtin/providers/aws/resource_aws_lambda_function_test.go (about) 1 package aws 2 3 import ( 4 "archive/zip" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "regexp" 10 "strings" 11 "testing" 12 13 "github.com/aws/aws-sdk-go/aws" 14 "github.com/aws/aws-sdk-go/service/lambda" 15 "github.com/hashicorp/terraform/helper/acctest" 16 "github.com/hashicorp/terraform/helper/resource" 17 "github.com/hashicorp/terraform/terraform" 18 ) 19 20 func TestAccAWSLambdaFunction_basic(t *testing.T) { 21 var conf lambda.GetFunctionOutput 22 23 rSt := acctest.RandString(5) 24 rName := fmt.Sprintf("tf_test_%s", rSt) 25 26 resource.Test(t, resource.TestCase{ 27 PreCheck: func() { testAccPreCheck(t) }, 28 Providers: testAccProviders, 29 CheckDestroy: testAccCheckLambdaFunctionDestroy, 30 Steps: []resource.TestStep{ 31 { 32 Config: testAccAWSLambdaConfigBasic(rName, rSt), 33 Check: resource.ComposeTestCheckFunc( 34 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 35 testAccCheckAwsLambdaFunctionName(&conf, rName), 36 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 37 ), 38 }, 39 }, 40 }) 41 } 42 43 func TestAccAWSLambdaFunction_updateRuntime(t *testing.T) { 44 var conf lambda.GetFunctionOutput 45 46 rSt := acctest.RandString(5) 47 rName := fmt.Sprintf("tf_test_%s", rSt) 48 49 resource.Test(t, resource.TestCase{ 50 PreCheck: func() { testAccPreCheck(t) }, 51 Providers: testAccProviders, 52 CheckDestroy: testAccCheckLambdaFunctionDestroy, 53 Steps: []resource.TestStep{ 54 { 55 Config: testAccAWSLambdaConfigBasic(rName, rSt), 56 Check: resource.ComposeTestCheckFunc( 57 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 58 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "runtime", "nodejs4.3"), 59 ), 60 }, 61 { 62 Config: testAccAWSLambdaConfigBasicUpdateRuntime(rName, rSt), 63 Check: resource.ComposeTestCheckFunc( 64 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 65 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "runtime", "nodejs4.3-edge"), 66 ), 67 }, 68 }, 69 }) 70 } 71 72 func TestAccAWSLambdaFunction_expectFilenameAndS3Attributes(t *testing.T) { 73 rSt := acctest.RandString(5) 74 rName := fmt.Sprintf("tf_test_%s", rSt) 75 76 resource.Test(t, resource.TestCase{ 77 PreCheck: func() { testAccPreCheck(t) }, 78 Providers: testAccProviders, 79 CheckDestroy: testAccCheckLambdaFunctionDestroy, 80 Steps: []resource.TestStep{ 81 { 82 Config: testAccAWSLambdaConfigWithoutFilenameAndS3Attributes(rName, rSt), 83 ExpectError: regexp.MustCompile(`filename or s3_\* attributes must be set`), 84 }, 85 }, 86 }) 87 } 88 89 func TestAccAWSLambdaFunction_envVariables(t *testing.T) { 90 var conf lambda.GetFunctionOutput 91 92 rSt := acctest.RandString(5) 93 rName := fmt.Sprintf("tf_test_%s", rSt) 94 95 resource.Test(t, resource.TestCase{ 96 PreCheck: func() { testAccPreCheck(t) }, 97 Providers: testAccProviders, 98 CheckDestroy: testAccCheckLambdaFunctionDestroy, 99 Steps: []resource.TestStep{ 100 { 101 Config: testAccAWSLambdaConfigBasic(rName, rSt), 102 Check: resource.ComposeTestCheckFunc( 103 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 104 testAccCheckAwsLambdaFunctionName(&conf, rName), 105 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 106 resource.TestCheckNoResourceAttr("aws_lambda_function.lambda_function_test", "environment"), 107 ), 108 }, 109 { 110 Config: testAccAWSLambdaConfigEnvVariables(rName, rSt), 111 Check: resource.ComposeTestCheckFunc( 112 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 113 testAccCheckAwsLambdaFunctionName(&conf, rName), 114 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 115 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "environment.0.variables.foo", "bar"), 116 ), 117 }, 118 { 119 Config: testAccAWSLambdaConfigEnvVariablesModified(rName, rSt), 120 Check: resource.ComposeTestCheckFunc( 121 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 122 testAccCheckAwsLambdaFunctionName(&conf, rName), 123 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 124 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "environment.0.variables.foo", "baz"), 125 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "environment.0.variables.foo1", "bar1"), 126 ), 127 }, 128 { 129 Config: testAccAWSLambdaConfigEnvVariablesModifiedWithoutEnvironment(rName, rSt), 130 Check: resource.ComposeTestCheckFunc( 131 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 132 testAccCheckAwsLambdaFunctionName(&conf, rName), 133 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 134 resource.TestCheckNoResourceAttr("aws_lambda_function.lambda_function_test", "environment"), 135 ), 136 }, 137 }, 138 }) 139 } 140 141 func TestAccAWSLambdaFunction_encryptedEnvVariables(t *testing.T) { 142 var conf lambda.GetFunctionOutput 143 144 rSt := acctest.RandString(5) 145 rName := fmt.Sprintf("tf_test_%s", rSt) 146 keyRegex := regexp.MustCompile("^arn:aws:kms:") 147 148 resource.Test(t, resource.TestCase{ 149 PreCheck: func() { testAccPreCheck(t) }, 150 Providers: testAccProviders, 151 CheckDestroy: testAccCheckLambdaFunctionDestroy, 152 Steps: []resource.TestStep{ 153 { 154 Config: testAccAWSLambdaConfigEncryptedEnvVariables(rName, rSt), 155 Check: resource.ComposeTestCheckFunc( 156 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 157 testAccCheckAwsLambdaFunctionName(&conf, rName), 158 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 159 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "environment.0.variables.foo", "bar"), 160 resource.TestMatchResourceAttr("aws_lambda_function.lambda_function_test", "kms_key_arn", keyRegex), 161 ), 162 }, 163 { 164 Config: testAccAWSLambdaConfigEncryptedEnvVariablesModified(rName, rSt), 165 Check: resource.ComposeTestCheckFunc( 166 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 167 testAccCheckAwsLambdaFunctionName(&conf, rName), 168 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 169 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "environment.0.variables.foo", "bar"), 170 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "kms_key_arn", ""), 171 ), 172 }, 173 }, 174 }) 175 } 176 177 func TestAccAWSLambdaFunction_versioned(t *testing.T) { 178 var conf lambda.GetFunctionOutput 179 180 rSt := acctest.RandString(5) 181 rName := fmt.Sprintf("tf_test_%s", rSt) 182 183 resource.Test(t, resource.TestCase{ 184 PreCheck: func() { testAccPreCheck(t) }, 185 Providers: testAccProviders, 186 CheckDestroy: testAccCheckLambdaFunctionDestroy, 187 Steps: []resource.TestStep{ 188 { 189 Config: testAccAWSLambdaConfigVersioned(rName, rSt), 190 Check: resource.ComposeTestCheckFunc( 191 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 192 testAccCheckAwsLambdaFunctionName(&conf, rName), 193 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 194 resource.TestMatchResourceAttr("aws_lambda_function.lambda_function_test", "version", 195 regexp.MustCompile("^[0-9]+$")), 196 resource.TestMatchResourceAttr("aws_lambda_function.lambda_function_test", "qualified_arn", 197 regexp.MustCompile(":"+rName+":[0-9]+$")), 198 ), 199 }, 200 }, 201 }) 202 } 203 204 func TestAccAWSLambdaFunction_DeadLetterConfig(t *testing.T) { 205 var conf lambda.GetFunctionOutput 206 207 rSt := acctest.RandString(5) 208 rName := fmt.Sprintf("tf_test_%s", rSt) 209 210 resource.Test(t, resource.TestCase{ 211 PreCheck: func() { testAccPreCheck(t) }, 212 Providers: testAccProviders, 213 CheckDestroy: testAccCheckLambdaFunctionDestroy, 214 Steps: []resource.TestStep{ 215 { 216 Config: testAccAWSLambdaConfigWithDeadLetterConfig(rName, rSt), 217 Check: resource.ComposeTestCheckFunc( 218 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 219 testAccCheckAwsLambdaFunctionName(&conf, rName), 220 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 221 func(s *terraform.State) error { 222 if !strings.HasSuffix(*conf.Configuration.DeadLetterConfig.TargetArn, ":"+rName) { 223 return fmt.Errorf( 224 "Expected DeadLetterConfig.TargetArn %s to have suffix %s", *conf.Configuration.DeadLetterConfig.TargetArn, ":"+rName, 225 ) 226 } 227 return nil 228 }, 229 ), 230 }, 231 }, 232 }) 233 } 234 235 func TestAccAWSLambdaFunction_VPC(t *testing.T) { 236 var conf lambda.GetFunctionOutput 237 238 rSt := acctest.RandString(5) 239 rName := fmt.Sprintf("tf_test_%s", rSt) 240 241 resource.Test(t, resource.TestCase{ 242 PreCheck: func() { testAccPreCheck(t) }, 243 Providers: testAccProviders, 244 CheckDestroy: testAccCheckLambdaFunctionDestroy, 245 Steps: []resource.TestStep{ 246 { 247 Config: testAccAWSLambdaConfigWithVPC(rName, rSt), 248 Check: resource.ComposeTestCheckFunc( 249 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 250 testAccCheckAwsLambdaFunctionName(&conf, rName), 251 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 252 testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"), 253 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.#", "1"), 254 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.0.subnet_ids.#", "1"), 255 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.0.security_group_ids.#", "1"), 256 resource.TestMatchResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.0.vpc_id", regexp.MustCompile("^vpc-")), 257 ), 258 }, 259 }, 260 }) 261 } 262 263 func TestAccAWSLambdaFunction_s3(t *testing.T) { 264 var conf lambda.GetFunctionOutput 265 rSt := acctest.RandString(5) 266 rName := fmt.Sprintf("tf_test_%s", rSt) 267 268 resource.Test(t, resource.TestCase{ 269 PreCheck: func() { testAccPreCheck(t) }, 270 Providers: testAccProviders, 271 CheckDestroy: testAccCheckLambdaFunctionDestroy, 272 Steps: []resource.TestStep{ 273 { 274 Config: testAccAWSLambdaConfigS3(rName, rSt), 275 Check: resource.ComposeTestCheckFunc( 276 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3test", rName, &conf), 277 testAccCheckAwsLambdaFunctionName(&conf, rName), 278 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName), 279 testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"), 280 ), 281 }, 282 }, 283 }) 284 } 285 286 func TestAccAWSLambdaFunction_localUpdate(t *testing.T) { 287 var conf lambda.GetFunctionOutput 288 289 path, zipFile, err := createTempFile("lambda_localUpdate") 290 if err != nil { 291 t.Fatal(err) 292 } 293 defer os.Remove(path) 294 295 rInt := acctest.RandInt() 296 297 resource.Test(t, resource.TestCase{ 298 PreCheck: func() { testAccPreCheck(t) }, 299 Providers: testAccProviders, 300 CheckDestroy: testAccCheckLambdaFunctionDestroy, 301 Steps: []resource.TestStep{ 302 { 303 PreConfig: func() { 304 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile) 305 }, 306 Config: genAWSLambdaFunctionConfig_local(path, rInt), 307 Check: resource.ComposeTestCheckFunc( 308 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", "tf_acc_lambda_name_local", &conf), 309 testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_local"), 310 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_local"), 311 testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="), 312 ), 313 }, 314 { 315 PreConfig: func() { 316 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, zipFile) 317 }, 318 Config: genAWSLambdaFunctionConfig_local(path, rInt), 319 Check: resource.ComposeTestCheckFunc( 320 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", "tf_acc_lambda_name_local", &conf), 321 testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_local"), 322 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_local"), 323 testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="), 324 ), 325 }, 326 }, 327 }) 328 } 329 330 func TestAccAWSLambdaFunction_localUpdate_nameOnly(t *testing.T) { 331 var conf lambda.GetFunctionOutput 332 333 rName := fmt.Sprintf("tf_test_iam_%d", acctest.RandInt()) 334 335 path, zipFile, err := createTempFile("lambda_localUpdate") 336 if err != nil { 337 t.Fatal(err) 338 } 339 defer os.Remove(path) 340 341 updatedPath, updatedZipFile, err := createTempFile("lambda_localUpdate_name_change") 342 if err != nil { 343 t.Fatal(err) 344 } 345 defer os.Remove(updatedPath) 346 347 resource.Test(t, resource.TestCase{ 348 PreCheck: func() { testAccPreCheck(t) }, 349 Providers: testAccProviders, 350 CheckDestroy: testAccCheckLambdaFunctionDestroy, 351 Steps: []resource.TestStep{ 352 { 353 PreConfig: func() { 354 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile) 355 }, 356 Config: genAWSLambdaFunctionConfig_local_name_only(path, rName), 357 Check: resource.ComposeTestCheckFunc( 358 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", rName, &conf), 359 testAccCheckAwsLambdaFunctionName(&conf, rName), 360 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, rName), 361 testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="), 362 ), 363 }, 364 { 365 PreConfig: func() { 366 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, updatedZipFile) 367 }, 368 Config: genAWSLambdaFunctionConfig_local_name_only(updatedPath, rName), 369 Check: resource.ComposeTestCheckFunc( 370 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", rName, &conf), 371 testAccCheckAwsLambdaFunctionName(&conf, rName), 372 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, rName), 373 testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="), 374 ), 375 }, 376 }, 377 }) 378 } 379 380 func TestAccAWSLambdaFunction_s3Update(t *testing.T) { 381 var conf lambda.GetFunctionOutput 382 383 path, zipFile, err := createTempFile("lambda_s3Update") 384 if err != nil { 385 t.Fatal(err) 386 } 387 defer os.Remove(path) 388 389 bucketName := fmt.Sprintf("tf-acc-lambda-s3-deployments-%d", randomInteger) 390 key := "lambda-func.zip" 391 392 rInt := acctest.RandInt() 393 394 resource.Test(t, resource.TestCase{ 395 PreCheck: func() { testAccPreCheck(t) }, 396 Providers: testAccProviders, 397 CheckDestroy: testAccCheckLambdaFunctionDestroy, 398 Steps: []resource.TestStep{ 399 { 400 PreConfig: func() { 401 // Upload 1st version 402 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile) 403 }, 404 Config: genAWSLambdaFunctionConfig_s3(bucketName, key, path, rInt), 405 Check: resource.ComposeTestCheckFunc( 406 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3", &conf), 407 testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3"), 408 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3"), 409 testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="), 410 ), 411 }, 412 { 413 ExpectNonEmptyPlan: true, 414 PreConfig: func() { 415 // Upload 2nd version 416 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, zipFile) 417 }, 418 Config: genAWSLambdaFunctionConfig_s3(bucketName, key, path, rInt), 419 }, 420 // Extra step because of missing ComputedWhen 421 // See https://github.com/hashicorp/terraform/pull/4846 & https://github.com/hashicorp/terraform/pull/5330 422 { 423 Config: genAWSLambdaFunctionConfig_s3(bucketName, key, path, rInt), 424 Check: resource.ComposeTestCheckFunc( 425 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3", &conf), 426 testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3"), 427 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3"), 428 testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="), 429 ), 430 }, 431 }, 432 }) 433 } 434 435 func TestAccAWSLambdaFunction_s3Update_unversioned(t *testing.T) { 436 var conf lambda.GetFunctionOutput 437 438 rName := fmt.Sprintf("tf_iam_lambda_%d", acctest.RandInt()) 439 440 path, zipFile, err := createTempFile("lambda_s3Update") 441 if err != nil { 442 t.Fatal(err) 443 } 444 defer os.Remove(path) 445 446 bucketName := fmt.Sprintf("tf-acc-lambda-s3-deployments-%d", randomInteger) 447 key := "lambda-func.zip" 448 key2 := "lambda-func-modified.zip" 449 450 resource.Test(t, resource.TestCase{ 451 PreCheck: func() { testAccPreCheck(t) }, 452 Providers: testAccProviders, 453 CheckDestroy: testAccCheckLambdaFunctionDestroy, 454 Steps: []resource.TestStep{ 455 { 456 PreConfig: func() { 457 // Upload 1st version 458 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile) 459 }, 460 Config: testAccAWSLambdaFunctionConfig_s3_unversioned_tpl(rName, bucketName, key, path), 461 Check: resource.ComposeTestCheckFunc( 462 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3_unversioned", &conf), 463 testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3_unversioned"), 464 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3_unversioned"), 465 testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="), 466 ), 467 }, 468 { 469 PreConfig: func() { 470 // Upload 2nd version 471 testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, zipFile) 472 }, 473 Config: testAccAWSLambdaFunctionConfig_s3_unversioned_tpl(rName, bucketName, key2, path), 474 Check: resource.ComposeTestCheckFunc( 475 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3_unversioned", &conf), 476 testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3_unversioned"), 477 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3_unversioned"), 478 testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="), 479 ), 480 }, 481 }, 482 }) 483 } 484 485 func TestAccAWSLambdaFunction_runtimeValidation_noRuntime(t *testing.T) { 486 rSt := acctest.RandString(5) 487 rName := fmt.Sprintf("tf_test_%s", rSt) 488 489 resource.Test(t, resource.TestCase{ 490 PreCheck: func() { testAccPreCheck(t) }, 491 Providers: testAccProviders, 492 CheckDestroy: testAccCheckLambdaFunctionDestroy, 493 Steps: []resource.TestStep{ 494 { 495 Config: testAccAWSLambdaConfigNoRuntime(rName, rSt), 496 ExpectError: regexp.MustCompile(`\\"runtime\\": required field is not set`), 497 }, 498 }, 499 }) 500 } 501 502 func TestAccAWSLambdaFunction_runtimeValidation_nodeJs(t *testing.T) { 503 rSt := acctest.RandString(5) 504 rName := fmt.Sprintf("tf_test_%s", rSt) 505 506 resource.Test(t, resource.TestCase{ 507 PreCheck: func() { testAccPreCheck(t) }, 508 Providers: testAccProviders, 509 CheckDestroy: testAccCheckLambdaFunctionDestroy, 510 Steps: []resource.TestStep{ 511 { 512 Config: testAccAWSLambdaConfigNodeJsRuntime(rName, rSt), 513 ExpectError: regexp.MustCompile(fmt.Sprintf("%s has reached end of life since October 2016 and has been deprecated in favor of %s", lambda.RuntimeNodejs, lambda.RuntimeNodejs43)), 514 }, 515 }, 516 }) 517 } 518 519 func TestAccAWSLambdaFunction_runtimeValidation_nodeJs43(t *testing.T) { 520 var conf lambda.GetFunctionOutput 521 rSt := acctest.RandString(5) 522 rName := fmt.Sprintf("tf_test_%s", rSt) 523 524 resource.Test(t, resource.TestCase{ 525 PreCheck: func() { testAccPreCheck(t) }, 526 Providers: testAccProviders, 527 CheckDestroy: testAccCheckLambdaFunctionDestroy, 528 Steps: []resource.TestStep{ 529 { 530 Config: testAccAWSLambdaConfigNodeJs43Runtime(rName, rSt), 531 Check: resource.ComposeTestCheckFunc( 532 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 533 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "runtime", lambda.RuntimeNodejs43), 534 ), 535 }, 536 }, 537 }) 538 } 539 540 func TestAccAWSLambdaFunction_runtimeValidation_python27(t *testing.T) { 541 var conf lambda.GetFunctionOutput 542 rSt := acctest.RandString(5) 543 rName := fmt.Sprintf("tf_test_%s", rSt) 544 545 resource.Test(t, resource.TestCase{ 546 PreCheck: func() { testAccPreCheck(t) }, 547 Providers: testAccProviders, 548 CheckDestroy: testAccCheckLambdaFunctionDestroy, 549 Steps: []resource.TestStep{ 550 { 551 Config: testAccAWSLambdaConfigPython27Runtime(rName, rSt), 552 Check: resource.ComposeTestCheckFunc( 553 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 554 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "runtime", lambda.RuntimePython27), 555 ), 556 }, 557 }, 558 }) 559 } 560 561 func TestAccAWSLambdaFunction_runtimeValidation_java8(t *testing.T) { 562 var conf lambda.GetFunctionOutput 563 rSt := acctest.RandString(5) 564 rName := fmt.Sprintf("tf_test_%s", rSt) 565 566 resource.Test(t, resource.TestCase{ 567 PreCheck: func() { testAccPreCheck(t) }, 568 Providers: testAccProviders, 569 CheckDestroy: testAccCheckLambdaFunctionDestroy, 570 Steps: []resource.TestStep{ 571 { 572 Config: testAccAWSLambdaConfigJava8Runtime(rName, rSt), 573 Check: resource.ComposeTestCheckFunc( 574 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf), 575 resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "runtime", lambda.RuntimeJava8), 576 ), 577 }, 578 }, 579 }) 580 } 581 582 func testAccCheckLambdaFunctionDestroy(s *terraform.State) error { 583 conn := testAccProvider.Meta().(*AWSClient).lambdaconn 584 585 for _, rs := range s.RootModule().Resources { 586 if rs.Type != "aws_lambda_function" { 587 continue 588 } 589 590 _, err := conn.GetFunction(&lambda.GetFunctionInput{ 591 FunctionName: aws.String(rs.Primary.ID), 592 }) 593 594 if err == nil { 595 return fmt.Errorf("Lambda Function still exists") 596 } 597 598 } 599 600 return nil 601 602 } 603 604 func testAccCheckAwsLambdaFunctionExists(res, funcName string, function *lambda.GetFunctionOutput) resource.TestCheckFunc { 605 // Wait for IAM role 606 return func(s *terraform.State) error { 607 rs, ok := s.RootModule().Resources[res] 608 if !ok { 609 return fmt.Errorf("Lambda function not found: %s", res) 610 } 611 612 if rs.Primary.ID == "" { 613 return fmt.Errorf("Lambda function ID not set") 614 } 615 616 conn := testAccProvider.Meta().(*AWSClient).lambdaconn 617 618 params := &lambda.GetFunctionInput{ 619 FunctionName: aws.String(funcName), 620 } 621 622 getFunction, err := conn.GetFunction(params) 623 if err != nil { 624 return err 625 } 626 627 *function = *getFunction 628 629 return nil 630 } 631 } 632 633 func testAccCheckAwsLambdaFunctionName(function *lambda.GetFunctionOutput, expectedName string) resource.TestCheckFunc { 634 return func(s *terraform.State) error { 635 c := function.Configuration 636 if *c.FunctionName != expectedName { 637 return fmt.Errorf("Expected function name %s, got %s", expectedName, *c.FunctionName) 638 } 639 640 return nil 641 } 642 } 643 644 func testAccCheckAWSLambdaFunctionVersion(function *lambda.GetFunctionOutput, expectedVersion string) resource.TestCheckFunc { 645 return func(s *terraform.State) error { 646 c := function.Configuration 647 if *c.Version != expectedVersion { 648 return fmt.Errorf("Expected version %s, got %s", expectedVersion, *c.Version) 649 } 650 return nil 651 } 652 } 653 654 func testAccCheckAwsLambdaFunctionArnHasSuffix(function *lambda.GetFunctionOutput, arnSuffix string) resource.TestCheckFunc { 655 return func(s *terraform.State) error { 656 c := function.Configuration 657 if !strings.HasSuffix(*c.FunctionArn, arnSuffix) { 658 return fmt.Errorf("Expected function ARN %s to have suffix %s", *c.FunctionArn, arnSuffix) 659 } 660 661 return nil 662 } 663 } 664 665 func testAccCheckAwsLambdaSourceCodeHash(function *lambda.GetFunctionOutput, expectedHash string) resource.TestCheckFunc { 666 return func(s *terraform.State) error { 667 c := function.Configuration 668 if *c.CodeSha256 != expectedHash { 669 return fmt.Errorf("Expected code hash %s, got %s", expectedHash, *c.CodeSha256) 670 } 671 672 return nil 673 } 674 } 675 676 func testAccCreateZipFromFiles(files map[string]string, zipFile *os.File) error { 677 zipFile.Truncate(0) 678 zipFile.Seek(0, 0) 679 680 w := zip.NewWriter(zipFile) 681 682 for source, destination := range files { 683 f, err := w.Create(destination) 684 if err != nil { 685 return err 686 } 687 688 fileContent, err := ioutil.ReadFile(source) 689 if err != nil { 690 return err 691 } 692 693 _, err = f.Write(fileContent) 694 if err != nil { 695 return err 696 } 697 } 698 699 err := w.Close() 700 if err != nil { 701 return err 702 } 703 704 return w.Flush() 705 } 706 707 func createTempFile(prefix string) (string, *os.File, error) { 708 f, err := ioutil.TempFile(os.TempDir(), prefix) 709 if err != nil { 710 return "", nil, err 711 } 712 713 pathToFile, err := filepath.Abs(f.Name()) 714 if err != nil { 715 return "", nil, err 716 } 717 return pathToFile, f, nil 718 } 719 720 func baseAccAWSLambdaConfig(rst string) string { 721 return fmt.Sprintf(` 722 resource "aws_iam_role_policy" "iam_policy_for_lambda" { 723 name = "iam_policy_for_lambda_%s" 724 role = "${aws_iam_role.iam_for_lambda.id}" 725 policy = <<EOF 726 { 727 "Version": "2012-10-17", 728 "Statement": [ 729 { 730 "Effect": "Allow", 731 "Action": [ 732 "logs:CreateLogGroup", 733 "logs:CreateLogStream", 734 "logs:PutLogEvents" 735 ], 736 "Resource": "arn:aws:logs:*:*:*" 737 }, 738 { 739 "Effect": "Allow", 740 "Action": [ 741 "ec2:CreateNetworkInterface", 742 "ec2:DescribeNetworkInterfaces", 743 "ec2:DeleteNetworkInterface" 744 ], 745 "Resource": [ 746 "*" 747 ] 748 }, 749 { 750 "Effect": "Allow", 751 "Action": [ 752 "SNS:Publish" 753 ], 754 "Resource": [ 755 "*" 756 ] 757 } 758 ] 759 } 760 EOF 761 } 762 763 resource "aws_iam_role" "iam_for_lambda" { 764 name = "iam_for_lambda_%s" 765 assume_role_policy = <<EOF 766 { 767 "Version": "2012-10-17", 768 "Statement": [ 769 { 770 "Action": "sts:AssumeRole", 771 "Principal": { 772 "Service": "lambda.amazonaws.com" 773 }, 774 "Effect": "Allow", 775 "Sid": "" 776 } 777 ] 778 } 779 EOF 780 } 781 782 resource "aws_vpc" "vpc_for_lambda" { 783 cidr_block = "10.0.0.0/16" 784 } 785 786 resource "aws_subnet" "subnet_for_lambda" { 787 vpc_id = "${aws_vpc.vpc_for_lambda.id}" 788 cidr_block = "10.0.1.0/24" 789 790 tags { 791 Name = "lambda" 792 } 793 } 794 795 resource "aws_security_group" "sg_for_lambda" { 796 name = "sg_for_lambda_%s" 797 description = "Allow all inbound traffic for lambda test" 798 vpc_id = "${aws_vpc.vpc_for_lambda.id}" 799 800 ingress { 801 from_port = 0 802 to_port = 0 803 protocol = "-1" 804 cidr_blocks = ["0.0.0.0/0"] 805 } 806 807 egress { 808 from_port = 0 809 to_port = 0 810 protocol = "-1" 811 cidr_blocks = ["0.0.0.0/0"] 812 } 813 }`, rst, rst, rst) 814 } 815 816 func testAccAWSLambdaConfigBasic(rName, rSt string) string { 817 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 818 resource "aws_lambda_function" "lambda_function_test" { 819 filename = "test-fixtures/lambdatest.zip" 820 function_name = "%s" 821 role = "${aws_iam_role.iam_for_lambda.arn}" 822 handler = "exports.example" 823 runtime = "nodejs4.3" 824 } 825 `, rName) 826 } 827 828 func testAccAWSLambdaConfigBasicUpdateRuntime(rName, rSt string) string { 829 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 830 resource "aws_lambda_function" "lambda_function_test" { 831 filename = "test-fixtures/lambdatest.zip" 832 function_name = "%s" 833 role = "${aws_iam_role.iam_for_lambda.arn}" 834 handler = "exports.example" 835 runtime = "nodejs4.3-edge" 836 } 837 `, rName) 838 } 839 840 func testAccAWSLambdaConfigWithoutFilenameAndS3Attributes(rName, rSt string) string { 841 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 842 resource "aws_lambda_function" "lambda_function_test" { 843 function_name = "%s" 844 role = "${aws_iam_role.iam_for_lambda.arn}" 845 handler = "exports.example" 846 runtime = "nodejs4.3" 847 } 848 `, rName) 849 } 850 851 func testAccAWSLambdaConfigEnvVariables(rName, rSt string) string { 852 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 853 resource "aws_lambda_function" "lambda_function_test" { 854 filename = "test-fixtures/lambdatest.zip" 855 function_name = "%s" 856 role = "${aws_iam_role.iam_for_lambda.arn}" 857 handler = "exports.example" 858 runtime = "nodejs4.3" 859 environment { 860 variables = { 861 foo = "bar" 862 } 863 } 864 } 865 `, rName) 866 } 867 868 func testAccAWSLambdaConfigEnvVariablesModified(rName, rSt string) string { 869 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 870 resource "aws_lambda_function" "lambda_function_test" { 871 filename = "test-fixtures/lambdatest.zip" 872 function_name = "%s" 873 role = "${aws_iam_role.iam_for_lambda.arn}" 874 handler = "exports.example" 875 runtime = "nodejs4.3" 876 environment { 877 variables = { 878 foo = "baz" 879 foo1 = "bar1" 880 } 881 } 882 } 883 `, rName) 884 } 885 886 func testAccAWSLambdaConfigEnvVariablesModifiedWithoutEnvironment(rName, rSt string) string { 887 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 888 resource "aws_lambda_function" "lambda_function_test" { 889 filename = "test-fixtures/lambdatest.zip" 890 function_name = "%s" 891 role = "${aws_iam_role.iam_for_lambda.arn}" 892 handler = "exports.example" 893 runtime = "nodejs4.3" 894 } 895 `, rName) 896 } 897 898 func testAccAWSLambdaConfigEncryptedEnvVariables(rName, rSt string) string { 899 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 900 resource "aws_kms_key" "foo" { 901 description = "Terraform acc test %s" 902 policy = <<POLICY 903 { 904 "Version": "2012-10-17", 905 "Id": "kms-tf-1", 906 "Statement": [ 907 { 908 "Sid": "Enable IAM User Permissions", 909 "Effect": "Allow", 910 "Principal": { 911 "AWS": "*" 912 }, 913 "Action": "kms:*", 914 "Resource": "*" 915 } 916 ] 917 } 918 POLICY 919 } 920 921 resource "aws_lambda_function" "lambda_function_test" { 922 filename = "test-fixtures/lambdatest.zip" 923 function_name = "%s" 924 role = "${aws_iam_role.iam_for_lambda.arn}" 925 handler = "exports.example" 926 kms_key_arn = "${aws_kms_key.foo.arn}" 927 runtime = "nodejs4.3" 928 environment { 929 variables = { 930 foo = "bar" 931 } 932 } 933 } 934 `, rName, rName) 935 } 936 937 func testAccAWSLambdaConfigEncryptedEnvVariablesModified(rName, rSt string) string { 938 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 939 resource "aws_lambda_function" "lambda_function_test" { 940 filename = "test-fixtures/lambdatest.zip" 941 function_name = "%s" 942 role = "${aws_iam_role.iam_for_lambda.arn}" 943 handler = "exports.example" 944 runtime = "nodejs4.3" 945 environment { 946 variables = { 947 foo = "bar" 948 } 949 } 950 } 951 `, rName) 952 } 953 954 func testAccAWSLambdaConfigVersioned(rName, rSt string) string { 955 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 956 resource "aws_lambda_function" "lambda_function_test" { 957 filename = "test-fixtures/lambdatest.zip" 958 function_name = "%s" 959 publish = true 960 role = "${aws_iam_role.iam_for_lambda.arn}" 961 handler = "exports.example" 962 runtime = "nodejs4.3" 963 } 964 `, rName) 965 } 966 967 func testAccAWSLambdaConfigWithDeadLetterConfig(rName, rSt string) string { 968 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 969 resource "aws_lambda_function" "lambda_function_test" { 970 filename = "test-fixtures/lambdatest.zip" 971 function_name = "%s" 972 role = "${aws_iam_role.iam_for_lambda.arn}" 973 handler = "exports.example" 974 runtime = "nodejs4.3" 975 976 dead_letter_config { 977 target_arn = "${aws_sns_topic.lambda_function_test.arn}" 978 } 979 } 980 981 resource "aws_sns_topic" "lambda_function_test" { 982 name = "%s" 983 } 984 985 `, rName, rName) 986 } 987 988 func testAccAWSLambdaConfigWithVPC(rName, rSt string) string { 989 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 990 resource "aws_lambda_function" "lambda_function_test" { 991 filename = "test-fixtures/lambdatest.zip" 992 function_name = "%s" 993 role = "${aws_iam_role.iam_for_lambda.arn}" 994 handler = "exports.example" 995 runtime = "nodejs4.3" 996 997 vpc_config = { 998 subnet_ids = ["${aws_subnet.subnet_for_lambda.id}"] 999 security_group_ids = ["${aws_security_group.sg_for_lambda.id}"] 1000 } 1001 }`, rName) 1002 } 1003 1004 func testAccAWSLambdaConfigS3(rName, rSt string) string { 1005 return fmt.Sprintf(` 1006 resource "aws_s3_bucket" "lambda_bucket" { 1007 bucket = "tf-test-bucket-%d" 1008 } 1009 1010 resource "aws_s3_bucket_object" "lambda_code" { 1011 bucket = "${aws_s3_bucket.lambda_bucket.id}" 1012 key = "lambdatest.zip" 1013 source = "test-fixtures/lambdatest.zip" 1014 } 1015 1016 resource "aws_iam_role" "iam_for_lambda" { 1017 name = "iam_for_lambda_%s" 1018 assume_role_policy = <<EOF 1019 { 1020 "Version": "2012-10-17", 1021 "Statement": [ 1022 { 1023 "Action": "sts:AssumeRole", 1024 "Principal": { 1025 "Service": "lambda.amazonaws.com" 1026 }, 1027 "Effect": "Allow", 1028 "Sid": "" 1029 } 1030 ] 1031 } 1032 EOF 1033 } 1034 1035 resource "aws_lambda_function" "lambda_function_s3test" { 1036 s3_bucket = "${aws_s3_bucket.lambda_bucket.id}" 1037 s3_key = "${aws_s3_bucket_object.lambda_code.id}" 1038 function_name = "%s" 1039 role = "${aws_iam_role.iam_for_lambda.arn}" 1040 handler = "exports.example" 1041 runtime = "nodejs4.3" 1042 } 1043 `, acctest.RandInt(), rSt, rName) 1044 } 1045 1046 func testAccAWSLambdaConfigNoRuntime(rName, rSt string) string { 1047 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 1048 resource "aws_lambda_function" "lambda_function_test" { 1049 filename = "test-fixtures/lambdatest.zip" 1050 function_name = "%s" 1051 role = "${aws_iam_role.iam_for_lambda.arn}" 1052 handler = "exports.example" 1053 runtime = "nodejs4.3" 1054 } 1055 `, rName) 1056 } 1057 1058 func testAccAWSLambdaConfigNodeJsRuntime(rName, rSt string) string { 1059 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 1060 resource "aws_lambda_function" "lambda_function_test" { 1061 filename = "test-fixtures/lambdatest.zip" 1062 function_name = "%s" 1063 role = "${aws_iam_role.iam_for_lambda.arn}" 1064 handler = "exports.example" 1065 runtime = "nodejs4.3" 1066 } 1067 `, rName) 1068 } 1069 1070 func testAccAWSLambdaConfigNodeJs43Runtime(rName, rSt string) string { 1071 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 1072 resource "aws_lambda_function" "lambda_function_test" { 1073 filename = "test-fixtures/lambdatest.zip" 1074 function_name = "%s" 1075 role = "${aws_iam_role.iam_for_lambda.arn}" 1076 handler = "exports.example" 1077 runtime = "nodejs4.3" 1078 } 1079 `, rName) 1080 } 1081 1082 func testAccAWSLambdaConfigPython27Runtime(rName, rSt string) string { 1083 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 1084 resource "aws_lambda_function" "lambda_function_test" { 1085 filename = "test-fixtures/lambdatest.zip" 1086 function_name = "%s" 1087 role = "${aws_iam_role.iam_for_lambda.arn}" 1088 handler = "exports.example" 1089 runtime = "python2.7" 1090 } 1091 `, rName) 1092 } 1093 1094 func testAccAWSLambdaConfigJava8Runtime(rName, rSt string) string { 1095 return fmt.Sprintf(baseAccAWSLambdaConfig(rSt)+` 1096 resource "aws_lambda_function" "lambda_function_test" { 1097 filename = "test-fixtures/lambdatest.zip" 1098 function_name = "%s" 1099 role = "${aws_iam_role.iam_for_lambda.arn}" 1100 handler = "exports.example" 1101 runtime = "java8" 1102 } 1103 `, rName) 1104 } 1105 1106 const testAccAWSLambdaFunctionConfig_local_tpl = ` 1107 resource "aws_iam_role" "iam_for_lambda" { 1108 name = "iam_for_lambda_%d" 1109 assume_role_policy = <<EOF 1110 { 1111 "Version": "2012-10-17", 1112 "Statement": [ 1113 { 1114 "Action": "sts:AssumeRole", 1115 "Principal": { 1116 "Service": "lambda.amazonaws.com" 1117 }, 1118 "Effect": "Allow", 1119 "Sid": "" 1120 } 1121 ] 1122 } 1123 EOF 1124 } 1125 resource "aws_lambda_function" "lambda_function_local" { 1126 filename = "%s" 1127 source_code_hash = "${base64sha256(file("%s"))}" 1128 function_name = "tf_acc_lambda_name_local" 1129 role = "${aws_iam_role.iam_for_lambda.arn}" 1130 handler = "exports.example" 1131 runtime = "nodejs4.3" 1132 } 1133 ` 1134 1135 func genAWSLambdaFunctionConfig_local(filePath string, rInt int) string { 1136 return fmt.Sprintf(testAccAWSLambdaFunctionConfig_local_tpl, rInt, 1137 filePath, filePath) 1138 } 1139 1140 func genAWSLambdaFunctionConfig_local_name_only(filePath, rName string) string { 1141 return testAccAWSLambdaFunctionConfig_local_name_only_tpl(filePath, rName) 1142 } 1143 1144 func testAccAWSLambdaFunctionConfig_local_name_only_tpl(filePath, rName string) string { 1145 return fmt.Sprintf(` 1146 resource "aws_iam_role" "iam_for_lambda" { 1147 name = "%s" 1148 assume_role_policy = <<EOF 1149 { 1150 "Version": "2012-10-17", 1151 "Statement": [ 1152 { 1153 "Action": "sts:AssumeRole", 1154 "Principal": { 1155 "Service": "lambda.amazonaws.com" 1156 }, 1157 "Effect": "Allow", 1158 "Sid": "" 1159 } 1160 ] 1161 } 1162 EOF 1163 } 1164 resource "aws_lambda_function" "lambda_function_local" { 1165 filename = "%s" 1166 function_name = "%s" 1167 role = "${aws_iam_role.iam_for_lambda.arn}" 1168 handler = "exports.example" 1169 runtime = "nodejs4.3" 1170 }`, rName, filePath, rName) 1171 } 1172 1173 const testAccAWSLambdaFunctionConfig_s3_tpl = ` 1174 resource "aws_s3_bucket" "artifacts" { 1175 bucket = "%s" 1176 acl = "private" 1177 force_destroy = true 1178 versioning { 1179 enabled = true 1180 } 1181 } 1182 resource "aws_s3_bucket_object" "o" { 1183 bucket = "${aws_s3_bucket.artifacts.bucket}" 1184 key = "%s" 1185 source = "%s" 1186 etag = "${md5(file("%s"))}" 1187 } 1188 resource "aws_iam_role" "iam_for_lambda" { 1189 name = "iam_for_lambda_%d" 1190 assume_role_policy = <<EOF 1191 { 1192 "Version": "2012-10-17", 1193 "Statement": [ 1194 { 1195 "Action": "sts:AssumeRole", 1196 "Principal": { 1197 "Service": "lambda.amazonaws.com" 1198 }, 1199 "Effect": "Allow", 1200 "Sid": "" 1201 } 1202 ] 1203 } 1204 EOF 1205 } 1206 resource "aws_lambda_function" "lambda_function_s3" { 1207 s3_bucket = "${aws_s3_bucket_object.o.bucket}" 1208 s3_key = "${aws_s3_bucket_object.o.key}" 1209 s3_object_version = "${aws_s3_bucket_object.o.version_id}" 1210 function_name = "tf_acc_lambda_name_s3" 1211 role = "${aws_iam_role.iam_for_lambda.arn}" 1212 handler = "exports.example" 1213 runtime = "nodejs4.3" 1214 } 1215 ` 1216 1217 func genAWSLambdaFunctionConfig_s3(bucket, key, path string, rInt int) string { 1218 return fmt.Sprintf(testAccAWSLambdaFunctionConfig_s3_tpl, 1219 bucket, key, path, path, rInt) 1220 } 1221 1222 func testAccAWSLambdaFunctionConfig_s3_unversioned_tpl(rName, bucketName, key, path string) string { 1223 return fmt.Sprintf(` 1224 resource "aws_s3_bucket" "artifacts" { 1225 bucket = "%s" 1226 acl = "private" 1227 force_destroy = true 1228 } 1229 resource "aws_s3_bucket_object" "o" { 1230 bucket = "${aws_s3_bucket.artifacts.bucket}" 1231 key = "%s" 1232 source = "%s" 1233 etag = "${md5(file("%s"))}" 1234 } 1235 resource "aws_iam_role" "iam_for_lambda" { 1236 name = "%s" 1237 assume_role_policy = <<EOF 1238 { 1239 "Version": "2012-10-17", 1240 "Statement": [ 1241 { 1242 "Action": "sts:AssumeRole", 1243 "Principal": { 1244 "Service": "lambda.amazonaws.com" 1245 }, 1246 "Effect": "Allow", 1247 "Sid": "" 1248 } 1249 ] 1250 } 1251 EOF 1252 } 1253 resource "aws_lambda_function" "lambda_function_s3" { 1254 s3_bucket = "${aws_s3_bucket_object.o.bucket}" 1255 s3_key = "${aws_s3_bucket_object.o.key}" 1256 function_name = "tf_acc_lambda_name_s3_unversioned" 1257 role = "${aws_iam_role.iam_for_lambda.arn}" 1258 handler = "exports.example" 1259 runtime = "nodejs4.3" 1260 }`, bucketName, key, path, path, rName) 1261 }