github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/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  	rName := fmt.Sprintf("tf_test_%s", acctest.RandString(5))
    24  
    25  	resource.Test(t, resource.TestCase{
    26  		PreCheck:     func() { testAccPreCheck(t) },
    27  		Providers:    testAccProviders,
    28  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
    29  		Steps: []resource.TestStep{
    30  			resource.TestStep{
    31  				Config: testAccAWSLambdaConfigBasic(rName),
    32  				Check: resource.ComposeTestCheckFunc(
    33  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf),
    34  					testAccCheckAwsLambdaFunctionName(&conf, rName),
    35  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName),
    36  				),
    37  			},
    38  		},
    39  	})
    40  }
    41  
    42  func TestAccAWSLambdaFunction_versioned(t *testing.T) {
    43  	var conf lambda.GetFunctionOutput
    44  
    45  	rName := fmt.Sprintf("tf_test_%s", acctest.RandString(5))
    46  
    47  	resource.Test(t, resource.TestCase{
    48  		PreCheck:     func() { testAccPreCheck(t) },
    49  		Providers:    testAccProviders,
    50  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
    51  		Steps: []resource.TestStep{
    52  			resource.TestStep{
    53  				Config: testAccAWSLambdaConfigVersioned(rName),
    54  				Check: resource.ComposeTestCheckFunc(
    55  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf),
    56  					testAccCheckAwsLambdaFunctionName(&conf, rName),
    57  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName),
    58  					resource.TestMatchResourceAttr("aws_lambda_function.lambda_function_test", "version",
    59  						regexp.MustCompile("^[0-9]+$")),
    60  					resource.TestMatchResourceAttr("aws_lambda_function.lambda_function_test", "qualified_arn",
    61  						regexp.MustCompile(":"+rName+":[0-9]+$")),
    62  				),
    63  			},
    64  		},
    65  	})
    66  }
    67  
    68  func TestAccAWSLambdaFunction_VPC(t *testing.T) {
    69  	var conf lambda.GetFunctionOutput
    70  	rName := fmt.Sprintf("tf_test_%s", acctest.RandString(5))
    71  
    72  	resource.Test(t, resource.TestCase{
    73  		PreCheck:     func() { testAccPreCheck(t) },
    74  		Providers:    testAccProviders,
    75  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
    76  		Steps: []resource.TestStep{
    77  			resource.TestStep{
    78  				Config: testAccAWSLambdaConfigWithVPC(rName),
    79  				Check: resource.ComposeTestCheckFunc(
    80  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", rName, &conf),
    81  					testAccCheckAwsLambdaFunctionName(&conf, rName),
    82  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName),
    83  					testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"),
    84  					resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.#", "1"),
    85  					resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.0.subnet_ids.#", "1"),
    86  					resource.TestCheckResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.0.security_group_ids.#", "1"),
    87  					resource.TestMatchResourceAttr("aws_lambda_function.lambda_function_test", "vpc_config.0.vpc_id", regexp.MustCompile("^vpc-")),
    88  				),
    89  			},
    90  		},
    91  	})
    92  }
    93  
    94  func TestAccAWSLambdaFunction_s3(t *testing.T) {
    95  	var conf lambda.GetFunctionOutput
    96  	rName := fmt.Sprintf("tf_test_%s", acctest.RandString(5))
    97  
    98  	resource.Test(t, resource.TestCase{
    99  		PreCheck:     func() { testAccPreCheck(t) },
   100  		Providers:    testAccProviders,
   101  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
   102  		Steps: []resource.TestStep{
   103  			resource.TestStep{
   104  				Config: testAccAWSLambdaConfigS3(rName),
   105  				Check: resource.ComposeTestCheckFunc(
   106  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3test", rName, &conf),
   107  					testAccCheckAwsLambdaFunctionName(&conf, rName),
   108  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":"+rName),
   109  					testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"),
   110  				),
   111  			},
   112  		},
   113  	})
   114  }
   115  
   116  func TestAccAWSLambdaFunction_localUpdate(t *testing.T) {
   117  	var conf lambda.GetFunctionOutput
   118  
   119  	path, zipFile, err := createTempFile("lambda_localUpdate")
   120  	if err != nil {
   121  		t.Fatal(err)
   122  	}
   123  	defer os.Remove(path)
   124  
   125  	resource.Test(t, resource.TestCase{
   126  		PreCheck:     func() { testAccPreCheck(t) },
   127  		Providers:    testAccProviders,
   128  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
   129  		Steps: []resource.TestStep{
   130  			resource.TestStep{
   131  				PreConfig: func() {
   132  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile)
   133  				},
   134  				Config: genAWSLambdaFunctionConfig_local(path),
   135  				Check: resource.ComposeTestCheckFunc(
   136  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", "tf_acc_lambda_name_local", &conf),
   137  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_local"),
   138  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_local"),
   139  					testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="),
   140  				),
   141  			},
   142  			resource.TestStep{
   143  				PreConfig: func() {
   144  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, zipFile)
   145  				},
   146  				Config: genAWSLambdaFunctionConfig_local(path),
   147  				Check: resource.ComposeTestCheckFunc(
   148  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", "tf_acc_lambda_name_local", &conf),
   149  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_local"),
   150  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_local"),
   151  					testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="),
   152  				),
   153  			},
   154  		},
   155  	})
   156  }
   157  
   158  func TestAccAWSLambdaFunction_localUpdate_nameOnly(t *testing.T) {
   159  	var conf lambda.GetFunctionOutput
   160  
   161  	path, zipFile, err := createTempFile("lambda_localUpdate")
   162  	if err != nil {
   163  		t.Fatal(err)
   164  	}
   165  	defer os.Remove(path)
   166  
   167  	updatedPath, updatedZipFile, err := createTempFile("lambda_localUpdate_name_change")
   168  	if err != nil {
   169  		t.Fatal(err)
   170  	}
   171  	defer os.Remove(updatedPath)
   172  
   173  	resource.Test(t, resource.TestCase{
   174  		PreCheck:     func() { testAccPreCheck(t) },
   175  		Providers:    testAccProviders,
   176  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
   177  		Steps: []resource.TestStep{
   178  			resource.TestStep{
   179  				PreConfig: func() {
   180  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile)
   181  				},
   182  				Config: genAWSLambdaFunctionConfig_local_name_only(path),
   183  				Check: resource.ComposeTestCheckFunc(
   184  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", "tf_acc_lambda_name_local", &conf),
   185  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_local"),
   186  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_local"),
   187  					testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="),
   188  				),
   189  			},
   190  			resource.TestStep{
   191  				PreConfig: func() {
   192  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, updatedZipFile)
   193  				},
   194  				Config: genAWSLambdaFunctionConfig_local_name_only(updatedPath),
   195  				Check: resource.ComposeTestCheckFunc(
   196  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_local", "tf_acc_lambda_name_local", &conf),
   197  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_local"),
   198  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_local"),
   199  					testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="),
   200  				),
   201  			},
   202  		},
   203  	})
   204  }
   205  
   206  func TestAccAWSLambdaFunction_s3Update(t *testing.T) {
   207  	var conf lambda.GetFunctionOutput
   208  
   209  	path, zipFile, err := createTempFile("lambda_s3Update")
   210  	if err != nil {
   211  		t.Fatal(err)
   212  	}
   213  	defer os.Remove(path)
   214  
   215  	bucketName := fmt.Sprintf("tf-acc-lambda-s3-deployments-%d", randomInteger)
   216  	key := "lambda-func.zip"
   217  
   218  	resource.Test(t, resource.TestCase{
   219  		PreCheck:     func() { testAccPreCheck(t) },
   220  		Providers:    testAccProviders,
   221  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
   222  		Steps: []resource.TestStep{
   223  			resource.TestStep{
   224  				PreConfig: func() {
   225  					// Upload 1st version
   226  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile)
   227  				},
   228  				Config: genAWSLambdaFunctionConfig_s3(bucketName, key, path),
   229  				Check: resource.ComposeTestCheckFunc(
   230  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3", &conf),
   231  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3"),
   232  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3"),
   233  					testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="),
   234  				),
   235  			},
   236  			resource.TestStep{
   237  				ExpectNonEmptyPlan: true,
   238  				PreConfig: func() {
   239  					// Upload 2nd version
   240  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, zipFile)
   241  				},
   242  				Config: genAWSLambdaFunctionConfig_s3(bucketName, key, path),
   243  			},
   244  			// Extra step because of missing ComputedWhen
   245  			// See https://github.com/hashicorp/terraform/pull/4846 & https://github.com/hashicorp/terraform/pull/5330
   246  			resource.TestStep{
   247  				Config: genAWSLambdaFunctionConfig_s3(bucketName, key, path),
   248  				Check: resource.ComposeTestCheckFunc(
   249  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3", &conf),
   250  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3"),
   251  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3"),
   252  					testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="),
   253  				),
   254  			},
   255  		},
   256  	})
   257  }
   258  
   259  func TestAccAWSLambdaFunction_s3Update_unversioned(t *testing.T) {
   260  	var conf lambda.GetFunctionOutput
   261  
   262  	path, zipFile, err := createTempFile("lambda_s3Update")
   263  	if err != nil {
   264  		t.Fatal(err)
   265  	}
   266  	defer os.Remove(path)
   267  
   268  	bucketName := fmt.Sprintf("tf-acc-lambda-s3-deployments-%d", randomInteger)
   269  	key := "lambda-func.zip"
   270  	key2 := "lambda-func-modified.zip"
   271  
   272  	resource.Test(t, resource.TestCase{
   273  		PreCheck:     func() { testAccPreCheck(t) },
   274  		Providers:    testAccProviders,
   275  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
   276  		Steps: []resource.TestStep{
   277  			resource.TestStep{
   278  				PreConfig: func() {
   279  					// Upload 1st version
   280  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func.js": "lambda.js"}, zipFile)
   281  				},
   282  				Config: genAWSLambdaFunctionConfig_s3_unversioned(bucketName, key, path),
   283  				Check: resource.ComposeTestCheckFunc(
   284  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3_unversioned", &conf),
   285  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3_unversioned"),
   286  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3_unversioned"),
   287  					testAccCheckAwsLambdaSourceCodeHash(&conf, "8DPiX+G1l2LQ8hjBkwRchQFf1TSCEvPrYGRKlM9UoyY="),
   288  				),
   289  			},
   290  			resource.TestStep{
   291  				PreConfig: func() {
   292  					// Upload 2nd version
   293  					testAccCreateZipFromFiles(map[string]string{"test-fixtures/lambda_func_modified.js": "lambda.js"}, zipFile)
   294  				},
   295  				Config: genAWSLambdaFunctionConfig_s3_unversioned(bucketName, key2, path),
   296  				Check: resource.ComposeTestCheckFunc(
   297  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3", "tf_acc_lambda_name_s3_unversioned", &conf),
   298  					testAccCheckAwsLambdaFunctionName(&conf, "tf_acc_lambda_name_s3_unversioned"),
   299  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, "tf_acc_lambda_name_s3_unversioned"),
   300  					testAccCheckAwsLambdaSourceCodeHash(&conf, "0tdaP9H9hsk9c2CycSwOG/sa/x5JyAmSYunA/ce99Pg="),
   301  				),
   302  			},
   303  		},
   304  	})
   305  }
   306  
   307  func testAccCheckLambdaFunctionDestroy(s *terraform.State) error {
   308  	conn := testAccProvider.Meta().(*AWSClient).lambdaconn
   309  
   310  	for _, rs := range s.RootModule().Resources {
   311  		if rs.Type != "aws_lambda_function" {
   312  			continue
   313  		}
   314  
   315  		_, err := conn.GetFunction(&lambda.GetFunctionInput{
   316  			FunctionName: aws.String(rs.Primary.ID),
   317  		})
   318  
   319  		if err == nil {
   320  			return fmt.Errorf("Lambda Function still exists")
   321  		}
   322  
   323  	}
   324  
   325  	return nil
   326  
   327  }
   328  
   329  func testAccCheckAwsLambdaFunctionExists(res, funcName string, function *lambda.GetFunctionOutput) resource.TestCheckFunc {
   330  	// Wait for IAM role
   331  	return func(s *terraform.State) error {
   332  		rs, ok := s.RootModule().Resources[res]
   333  		if !ok {
   334  			return fmt.Errorf("Lambda function not found: %s", res)
   335  		}
   336  
   337  		if rs.Primary.ID == "" {
   338  			return fmt.Errorf("Lambda function ID not set")
   339  		}
   340  
   341  		conn := testAccProvider.Meta().(*AWSClient).lambdaconn
   342  
   343  		params := &lambda.GetFunctionInput{
   344  			FunctionName: aws.String(funcName),
   345  		}
   346  
   347  		getFunction, err := conn.GetFunction(params)
   348  		if err != nil {
   349  			return err
   350  		}
   351  
   352  		*function = *getFunction
   353  
   354  		return nil
   355  	}
   356  }
   357  
   358  func testAccCheckAwsLambdaFunctionName(function *lambda.GetFunctionOutput, expectedName string) resource.TestCheckFunc {
   359  	return func(s *terraform.State) error {
   360  		c := function.Configuration
   361  		if *c.FunctionName != expectedName {
   362  			return fmt.Errorf("Expected function name %s, got %s", expectedName, *c.FunctionName)
   363  		}
   364  
   365  		return nil
   366  	}
   367  }
   368  
   369  func testAccCheckAWSLambdaFunctionVersion(function *lambda.GetFunctionOutput, expectedVersion string) resource.TestCheckFunc {
   370  	return func(s *terraform.State) error {
   371  		c := function.Configuration
   372  		if *c.Version != expectedVersion {
   373  			return fmt.Errorf("Expected version %s, got %s", expectedVersion, *c.Version)
   374  		}
   375  		return nil
   376  	}
   377  }
   378  
   379  func testAccCheckAwsLambdaFunctionArnHasSuffix(function *lambda.GetFunctionOutput, arnSuffix string) resource.TestCheckFunc {
   380  	return func(s *terraform.State) error {
   381  		c := function.Configuration
   382  		if !strings.HasSuffix(*c.FunctionArn, arnSuffix) {
   383  			return fmt.Errorf("Expected function ARN %s to have suffix %s", *c.FunctionArn, arnSuffix)
   384  		}
   385  
   386  		return nil
   387  	}
   388  }
   389  
   390  func testAccCheckAwsLambdaSourceCodeHash(function *lambda.GetFunctionOutput, expectedHash string) resource.TestCheckFunc {
   391  	return func(s *terraform.State) error {
   392  		c := function.Configuration
   393  		if *c.CodeSha256 != expectedHash {
   394  			return fmt.Errorf("Expected code hash %s, got %s", expectedHash, *c.CodeSha256)
   395  		}
   396  
   397  		return nil
   398  	}
   399  }
   400  
   401  func testAccCreateZipFromFiles(files map[string]string, zipFile *os.File) error {
   402  	zipFile.Truncate(0)
   403  	zipFile.Seek(0, 0)
   404  
   405  	w := zip.NewWriter(zipFile)
   406  
   407  	for source, destination := range files {
   408  		f, err := w.Create(destination)
   409  		if err != nil {
   410  			return err
   411  		}
   412  
   413  		fileContent, err := ioutil.ReadFile(source)
   414  		if err != nil {
   415  			return err
   416  		}
   417  
   418  		_, err = f.Write(fileContent)
   419  		if err != nil {
   420  			return err
   421  		}
   422  	}
   423  
   424  	err := w.Close()
   425  	if err != nil {
   426  		return err
   427  	}
   428  
   429  	return w.Flush()
   430  }
   431  
   432  func createTempFile(prefix string) (string, *os.File, error) {
   433  	f, err := ioutil.TempFile(os.TempDir(), prefix)
   434  	if err != nil {
   435  		return "", nil, err
   436  	}
   437  
   438  	pathToFile, err := filepath.Abs(f.Name())
   439  	if err != nil {
   440  		return "", nil, err
   441  	}
   442  	return pathToFile, f, nil
   443  }
   444  
   445  const baseAccAWSLambdaConfig = `
   446  resource "aws_iam_role_policy" "iam_policy_for_lambda" {
   447      name = "iam_policy_for_lambda"
   448      role = "${aws_iam_role.iam_for_lambda.id}"
   449      policy = <<EOF
   450  {
   451    "Version": "2012-10-17",
   452    "Statement": [
   453          {
   454              "Effect": "Allow",
   455              "Action": [
   456                  "logs:CreateLogGroup",
   457                  "logs:CreateLogStream",
   458                  "logs:PutLogEvents"
   459              ],
   460              "Resource": "arn:aws:logs:*:*:*"
   461          },
   462      {
   463        "Effect": "Allow",
   464        "Action": [
   465          "ec2:CreateNetworkInterface"
   466        ],
   467        "Resource": [
   468          "*"
   469        ]
   470      }
   471    ]
   472  }
   473  EOF
   474  }
   475  
   476  resource "aws_iam_role" "iam_for_lambda" {
   477      name = "iam_for_lambda"
   478      assume_role_policy = <<EOF
   479  {
   480    "Version": "2012-10-17",
   481    "Statement": [
   482      {
   483        "Action": "sts:AssumeRole",
   484        "Principal": {
   485          "Service": "lambda.amazonaws.com"
   486        },
   487        "Effect": "Allow",
   488        "Sid": ""
   489      }
   490    ]
   491  }
   492  EOF
   493  }
   494  
   495  resource "aws_vpc" "vpc_for_lambda" {
   496      cidr_block = "10.0.0.0/16"
   497  }
   498  
   499  resource "aws_subnet" "subnet_for_lambda" {
   500      vpc_id = "${aws_vpc.vpc_for_lambda.id}"
   501      cidr_block = "10.0.1.0/24"
   502  
   503      tags {
   504          Name = "lambda"
   505      }
   506  }
   507  
   508  resource "aws_security_group" "sg_for_lambda" {
   509    name = "sg_for_lambda"
   510    description = "Allow all inbound traffic for lambda test"
   511    vpc_id = "${aws_vpc.vpc_for_lambda.id}"
   512  
   513    ingress {
   514        from_port = 0
   515        to_port = 0
   516        protocol = "-1"
   517        cidr_blocks = ["0.0.0.0/0"]
   518    }
   519  
   520    egress {
   521        from_port = 0
   522        to_port = 0
   523        protocol = "-1"
   524        cidr_blocks = ["0.0.0.0/0"]
   525    }
   526  }
   527  
   528  `
   529  
   530  func testAccAWSLambdaConfigBasic(rName string) string {
   531  	return fmt.Sprintf(baseAccAWSLambdaConfig+`
   532  resource "aws_lambda_function" "lambda_function_test" {
   533      filename = "test-fixtures/lambdatest.zip"
   534      function_name = "%s"
   535      role = "${aws_iam_role.iam_for_lambda.arn}"
   536      handler = "exports.example"
   537  }
   538  `, rName)
   539  }
   540  
   541  func testAccAWSLambdaConfigVersioned(rName string) string {
   542  	return fmt.Sprintf(baseAccAWSLambdaConfig+`
   543  resource "aws_lambda_function" "lambda_function_test" {
   544      filename = "test-fixtures/lambdatest.zip"
   545      function_name = "%s"
   546      publish = true
   547      role = "${aws_iam_role.iam_for_lambda.arn}"
   548      handler = "exports.example"
   549  }
   550  `, rName)
   551  }
   552  
   553  func testAccAWSLambdaConfigWithVPC(rName string) string {
   554  	return fmt.Sprintf(baseAccAWSLambdaConfig+`
   555  resource "aws_lambda_function" "lambda_function_test" {
   556      filename = "test-fixtures/lambdatest.zip"
   557      function_name = "%s"
   558      role = "${aws_iam_role.iam_for_lambda.arn}"
   559      handler = "exports.example"
   560  
   561      vpc_config = {
   562          subnet_ids = ["${aws_subnet.subnet_for_lambda.id}"]
   563          security_group_ids = ["${aws_security_group.sg_for_lambda.id}"]
   564      }
   565  }`, rName)
   566  }
   567  
   568  func testAccAWSLambdaConfigS3(rName string) string {
   569  	return fmt.Sprintf(`
   570  resource "aws_s3_bucket" "lambda_bucket" {
   571    bucket = "tf-test-bucket-%d"
   572  }
   573  
   574  resource "aws_s3_bucket_object" "lambda_code" {
   575    bucket = "${aws_s3_bucket.lambda_bucket.id}"
   576    key = "lambdatest.zip"
   577    source = "test-fixtures/lambdatest.zip"
   578  }
   579  
   580  resource "aws_iam_role" "iam_for_lambda" {
   581      name = "iam_for_lambda"
   582      assume_role_policy = <<EOF
   583  {
   584    "Version": "2012-10-17",
   585    "Statement": [
   586      {
   587        "Action": "sts:AssumeRole",
   588        "Principal": {
   589          "Service": "lambda.amazonaws.com"
   590        },
   591        "Effect": "Allow",
   592        "Sid": ""
   593      }
   594    ]
   595  }
   596  EOF
   597  }
   598  
   599  resource "aws_lambda_function" "lambda_function_s3test" {
   600      s3_bucket = "${aws_s3_bucket.lambda_bucket.id}"
   601      s3_key = "${aws_s3_bucket_object.lambda_code.id}"
   602      function_name = "%s"
   603      role = "${aws_iam_role.iam_for_lambda.arn}"
   604      handler = "exports.example"
   605  }
   606  `, acctest.RandInt(), rName)
   607  }
   608  
   609  const testAccAWSLambdaFunctionConfig_local_tpl = `
   610  resource "aws_iam_role" "iam_for_lambda" {
   611      name = "iam_for_lambda"
   612      assume_role_policy = <<EOF
   613  {
   614    "Version": "2012-10-17",
   615    "Statement": [
   616      {
   617        "Action": "sts:AssumeRole",
   618        "Principal": {
   619          "Service": "lambda.amazonaws.com"
   620        },
   621        "Effect": "Allow",
   622        "Sid": ""
   623      }
   624    ]
   625  }
   626  EOF
   627  }
   628  resource "aws_lambda_function" "lambda_function_local" {
   629      filename = "%s"
   630      source_code_hash = "${base64sha256(file("%s"))}"
   631      function_name = "tf_acc_lambda_name_local"
   632      role = "${aws_iam_role.iam_for_lambda.arn}"
   633      handler = "exports.example"
   634  }
   635  `
   636  
   637  func genAWSLambdaFunctionConfig_local(filePath string) string {
   638  	return fmt.Sprintf(testAccAWSLambdaFunctionConfig_local_tpl,
   639  		filePath, filePath)
   640  }
   641  
   642  func genAWSLambdaFunctionConfig_local_name_only(filePath string) string {
   643  	return fmt.Sprintf(testAccAWSLambdaFunctionConfig_local_name_only_tpl,
   644  		filePath)
   645  }
   646  
   647  const testAccAWSLambdaFunctionConfig_local_name_only_tpl = `
   648  resource "aws_iam_role" "iam_for_lambda" {
   649      name = "iam_for_lambda"
   650      assume_role_policy = <<EOF
   651  {
   652    "Version": "2012-10-17",
   653    "Statement": [
   654      {
   655        "Action": "sts:AssumeRole",
   656        "Principal": {
   657          "Service": "lambda.amazonaws.com"
   658        },
   659        "Effect": "Allow",
   660        "Sid": ""
   661      }
   662    ]
   663  }
   664  EOF
   665  }
   666  resource "aws_lambda_function" "lambda_function_local" {
   667      filename = "%s"
   668      function_name = "tf_acc_lambda_name_local"
   669      role = "${aws_iam_role.iam_for_lambda.arn}"
   670      handler = "exports.example"
   671  }
   672  `
   673  
   674  const testAccAWSLambdaFunctionConfig_s3_tpl = `
   675  resource "aws_s3_bucket" "artifacts" {
   676  	bucket = "%s"
   677  	acl = "private"
   678  	force_destroy = true
   679  	versioning {
   680  		enabled = true
   681  	}
   682  }
   683  resource "aws_s3_bucket_object" "o" {
   684  	bucket = "${aws_s3_bucket.artifacts.bucket}"
   685  	key = "%s"
   686  	source = "%s"
   687  	etag = "${md5(file("%s"))}"
   688  }
   689  resource "aws_iam_role" "iam_for_lambda" {
   690      name = "iam_for_lambda"
   691      assume_role_policy = <<EOF
   692  {
   693    "Version": "2012-10-17",
   694    "Statement": [
   695      {
   696        "Action": "sts:AssumeRole",
   697        "Principal": {
   698          "Service": "lambda.amazonaws.com"
   699        },
   700        "Effect": "Allow",
   701        "Sid": ""
   702      }
   703    ]
   704  }
   705  EOF
   706  }
   707  resource "aws_lambda_function" "lambda_function_s3" {
   708  	s3_bucket = "${aws_s3_bucket_object.o.bucket}"
   709  	s3_key = "${aws_s3_bucket_object.o.key}"
   710  	s3_object_version = "${aws_s3_bucket_object.o.version_id}"
   711      function_name = "tf_acc_lambda_name_s3"
   712      role = "${aws_iam_role.iam_for_lambda.arn}"
   713      handler = "exports.example"
   714  }
   715  `
   716  
   717  func genAWSLambdaFunctionConfig_s3(bucket, key, path string) string {
   718  	return fmt.Sprintf(testAccAWSLambdaFunctionConfig_s3_tpl,
   719  		bucket, key, path, path)
   720  }
   721  
   722  const testAccAWSLambdaFunctionConfig_s3_unversioned_tpl = `
   723  resource "aws_s3_bucket" "artifacts" {
   724  	bucket = "%s"
   725  	acl = "private"
   726  	force_destroy = true
   727  }
   728  resource "aws_s3_bucket_object" "o" {
   729  	bucket = "${aws_s3_bucket.artifacts.bucket}"
   730  	key = "%s"
   731  	source = "%s"
   732  	etag = "${md5(file("%s"))}"
   733  }
   734  resource "aws_iam_role" "iam_for_lambda" {
   735      name = "iam_for_lambda"
   736      assume_role_policy = <<EOF
   737  {
   738    "Version": "2012-10-17",
   739    "Statement": [
   740      {
   741        "Action": "sts:AssumeRole",
   742        "Principal": {
   743          "Service": "lambda.amazonaws.com"
   744        },
   745        "Effect": "Allow",
   746        "Sid": ""
   747      }
   748    ]
   749  }
   750  EOF
   751  }
   752  resource "aws_lambda_function" "lambda_function_s3" {
   753  	s3_bucket = "${aws_s3_bucket_object.o.bucket}"
   754  	s3_key = "${aws_s3_bucket_object.o.key}"
   755      function_name = "tf_acc_lambda_name_s3_unversioned"
   756      role = "${aws_iam_role.iam_for_lambda.arn}"
   757      handler = "exports.example"
   758  }
   759  `
   760  
   761  func genAWSLambdaFunctionConfig_s3_unversioned(bucket, key, path string) string {
   762  	return fmt.Sprintf(testAccAWSLambdaFunctionConfig_s3_unversioned_tpl,
   763  		bucket, key, path, path)
   764  }