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  }