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