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  }