github.com/articulate/terraform@v0.6.13-0.20160303003731-8d31c93862de/builtin/providers/aws/resource_aws_lambda_function_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/service/lambda" 10 "github.com/hashicorp/terraform/helper/acctest" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestAccAWSLambdaFunction_basic(t *testing.T) { 16 var conf lambda.GetFunctionOutput 17 18 resource.Test(t, resource.TestCase{ 19 PreCheck: func() { testAccPreCheck(t) }, 20 Providers: testAccProviders, 21 CheckDestroy: testAccCheckLambdaFunctionDestroy, 22 Steps: []resource.TestStep{ 23 resource.TestStep{ 24 Config: testAccAWSLambdaConfigBasic, 25 Check: resource.ComposeTestCheckFunc( 26 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", "example_lambda_name", &conf), 27 testAccCheckAwsLambdaFunctionName(&conf, "example_lambda_name"), 28 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":example_lambda_name"), 29 ), 30 }, 31 }, 32 }) 33 } 34 35 func TestAccAWSLambdaFunction_VPC(t *testing.T) { 36 var conf lambda.GetFunctionOutput 37 38 resource.Test(t, resource.TestCase{ 39 PreCheck: func() { testAccPreCheck(t) }, 40 Providers: testAccProviders, 41 CheckDestroy: testAccCheckLambdaFunctionDestroy, 42 Steps: []resource.TestStep{ 43 resource.TestStep{ 44 Config: testAccAWSLambdaConfigWithVPC, 45 Check: resource.ComposeTestCheckFunc( 46 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", "example_lambda_name", &conf), 47 testAccCheckAwsLambdaFunctionName(&conf, "example_lambda_name"), 48 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":example_lambda_name"), 49 testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"), 50 ), 51 }, 52 }, 53 }) 54 } 55 56 func TestAccAWSLambdaFunction_s3(t *testing.T) { 57 var conf lambda.GetFunctionOutput 58 59 resource.Test(t, resource.TestCase{ 60 PreCheck: func() { testAccPreCheck(t) }, 61 Providers: testAccProviders, 62 CheckDestroy: testAccCheckLambdaFunctionDestroy, 63 Steps: []resource.TestStep{ 64 resource.TestStep{ 65 Config: testAccAWSLambdaConfigS3, 66 Check: resource.ComposeTestCheckFunc( 67 testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3test", "example_lambda_name_s3", &conf), 68 testAccCheckAwsLambdaFunctionName(&conf, "example_lambda_name_s3"), 69 testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":example_lambda_name_s3"), 70 testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"), 71 ), 72 }, 73 }, 74 }) 75 } 76 77 func testAccCheckLambdaFunctionDestroy(s *terraform.State) error { 78 conn := testAccProvider.Meta().(*AWSClient).lambdaconn 79 80 for _, rs := range s.RootModule().Resources { 81 if rs.Type != "aws_lambda_function" { 82 continue 83 } 84 85 _, err := conn.GetFunction(&lambda.GetFunctionInput{ 86 FunctionName: aws.String(rs.Primary.ID), 87 }) 88 89 if err == nil { 90 return fmt.Errorf("Lambda Function still exists") 91 } 92 93 } 94 95 return nil 96 97 } 98 99 func testAccCheckAwsLambdaFunctionExists(res, funcName string, function *lambda.GetFunctionOutput) resource.TestCheckFunc { 100 // Wait for IAM role 101 return func(s *terraform.State) error { 102 rs, ok := s.RootModule().Resources[res] 103 if !ok { 104 return fmt.Errorf("Lambda function not found: %s", res) 105 } 106 107 if rs.Primary.ID == "" { 108 return fmt.Errorf("Lambda function ID not set") 109 } 110 111 conn := testAccProvider.Meta().(*AWSClient).lambdaconn 112 113 params := &lambda.GetFunctionInput{ 114 FunctionName: aws.String(funcName), 115 } 116 117 getFunction, err := conn.GetFunction(params) 118 if err != nil { 119 return err 120 } 121 122 *function = *getFunction 123 124 return nil 125 } 126 } 127 128 func testAccCheckAwsLambdaFunctionName(function *lambda.GetFunctionOutput, expectedName string) resource.TestCheckFunc { 129 return func(s *terraform.State) error { 130 c := function.Configuration 131 if *c.FunctionName != expectedName { 132 return fmt.Errorf("Expected function name %s, got %s", expectedName, *c.FunctionName) 133 } 134 135 return nil 136 } 137 } 138 139 func testAccCheckAWSLambdaFunctionVersion(function *lambda.GetFunctionOutput, expectedVersion string) resource.TestCheckFunc { 140 return func(s *terraform.State) error { 141 c := function.Configuration 142 if *c.Version != expectedVersion { 143 return fmt.Errorf("Expected version %s, got %s", expectedVersion, *c.Version) 144 } 145 return nil 146 } 147 } 148 149 func testAccCheckAwsLambdaFunctionArnHasSuffix(function *lambda.GetFunctionOutput, arnSuffix string) resource.TestCheckFunc { 150 return func(s *terraform.State) error { 151 c := function.Configuration 152 if !strings.HasSuffix(*c.FunctionArn, arnSuffix) { 153 return fmt.Errorf("Expected function ARN %s to have suffix %s", *c.FunctionArn, arnSuffix) 154 } 155 156 return nil 157 } 158 } 159 160 const baseAccAWSLambdaConfig = ` 161 resource "aws_iam_role_policy" "iam_policy_for_lambda" { 162 name = "iam_policy_for_lambda" 163 role = "${aws_iam_role.iam_for_lambda.id}" 164 policy = <<EOF 165 { 166 "Version": "2012-10-17", 167 "Statement": [ 168 { 169 "Effect": "Allow", 170 "Action": [ 171 "logs:CreateLogGroup", 172 "logs:CreateLogStream", 173 "logs:PutLogEvents" 174 ], 175 "Resource": "arn:aws:logs:*:*:*" 176 }, 177 { 178 "Effect": "Allow", 179 "Action": [ 180 "ec2:CreateNetworkInterface" 181 ], 182 "Resource": [ 183 "*" 184 ] 185 } 186 ] 187 } 188 EOF 189 } 190 191 resource "aws_iam_role" "iam_for_lambda" { 192 name = "iam_for_lambda" 193 assume_role_policy = <<EOF 194 { 195 "Version": "2012-10-17", 196 "Statement": [ 197 { 198 "Action": "sts:AssumeRole", 199 "Principal": { 200 "Service": "lambda.amazonaws.com" 201 }, 202 "Effect": "Allow", 203 "Sid": "" 204 } 205 ] 206 } 207 EOF 208 } 209 210 resource "aws_vpc" "vpc_for_lambda" { 211 cidr_block = "10.0.0.0/16" 212 } 213 214 resource "aws_subnet" "subnet_for_lambda" { 215 vpc_id = "${aws_vpc.vpc_for_lambda.id}" 216 cidr_block = "10.0.1.0/24" 217 218 tags { 219 Name = "lambda" 220 } 221 } 222 223 resource "aws_security_group" "sg_for_lambda" { 224 name = "sg_for_lambda" 225 description = "Allow all inbound traffic for lambda test" 226 vpc_id = "${aws_vpc.vpc_for_lambda.id}" 227 228 ingress { 229 from_port = 0 230 to_port = 0 231 protocol = "-1" 232 cidr_blocks = ["0.0.0.0/0"] 233 } 234 235 egress { 236 from_port = 0 237 to_port = 0 238 protocol = "-1" 239 cidr_blocks = ["0.0.0.0/0"] 240 } 241 } 242 243 ` 244 245 const testAccAWSLambdaConfigBasic = baseAccAWSLambdaConfig + ` 246 resource "aws_lambda_function" "lambda_function_test" { 247 filename = "test-fixtures/lambdatest.zip" 248 function_name = "example_lambda_name" 249 role = "${aws_iam_role.iam_for_lambda.arn}" 250 handler = "exports.example" 251 } 252 ` 253 254 const testAccAWSLambdaConfigWithVPC = baseAccAWSLambdaConfig + ` 255 resource "aws_lambda_function" "lambda_function_test" { 256 filename = "test-fixtures/lambdatest.zip" 257 function_name = "example_lambda_name" 258 role = "${aws_iam_role.iam_for_lambda.arn}" 259 handler = "exports.example" 260 261 vpc_config = { 262 subnet_ids = ["${aws_subnet.subnet_for_lambda.id}"] 263 security_group_ids = ["${aws_security_group.sg_for_lambda.id}"] 264 } 265 } 266 ` 267 268 var testAccAWSLambdaConfigS3 = fmt.Sprintf(` 269 resource "aws_s3_bucket" "lambda_bucket" { 270 bucket = "tf-test-bucket-%d" 271 } 272 273 resource "aws_s3_bucket_object" "lambda_code" { 274 bucket = "${aws_s3_bucket.lambda_bucket.id}" 275 key = "lambdatest.zip" 276 source = "test-fixtures/lambdatest.zip" 277 } 278 279 resource "aws_iam_role" "iam_for_lambda" { 280 name = "iam_for_lambda" 281 assume_role_policy = <<EOF 282 { 283 "Version": "2012-10-17", 284 "Statement": [ 285 { 286 "Action": "sts:AssumeRole", 287 "Principal": { 288 "Service": "lambda.amazonaws.com" 289 }, 290 "Effect": "Allow", 291 "Sid": "" 292 } 293 ] 294 } 295 EOF 296 } 297 298 resource "aws_lambda_function" "lambda_function_s3test" { 299 s3_bucket = "${aws_s3_bucket.lambda_bucket.id}" 300 s3_key = "${aws_s3_bucket_object.lambda_code.id}" 301 function_name = "example_lambda_name_s3" 302 role = "${aws_iam_role.iam_for_lambda.arn}" 303 handler = "exports.example" 304 } 305 `, acctest.RandInt())