diff --git a/README.md b/README.md index 3599cc0..db39fa3 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,11 @@ The rest of these Environment Variables can be set to match AWS Lambda's environ * `AWS_LAMBDA_FUNCTION_NAME` * `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` +By default `aws-lambda-rie` sets the value of the `AWS_LAMBDA_FUNCTION_NAME` environment variable to `test_function`, while the +function name in the endpoint URL is `function`. If you want the RIE to behave like AWS Lambda, where the function name in the +endpoint matches the value of the environment variable, set the value of the `AWS_LAMBDA_RIE_INCONSISTENT_BEHAVIOUR` +environment variable to `"FALSE"`. + ## Level of support You can use the emulator to test if your function code is compatible with the Lambda environment, executes successfully diff --git a/cmd/aws-lambda-rie/handlers.go b/cmd/aws-lambda-rie/handlers.go index 2cca12d..ad16e2b 100644 --- a/cmd/aws-lambda-rie/handlers.go +++ b/cmd/aws-lambda-rie/handlers.go @@ -55,6 +55,14 @@ func GetenvWithDefault(key string, defaultValue string) string { return envValue } +func GetFunctionName() string { + defaultValue := "function" + if GetenvWithDefault("AWS_LAMBDA_RIE_INCONSISTENT_BEHAVIOUR", "TRUE") == "TRUE" { + defaultValue = "test_function" + } + return GetenvWithDefault("AWS_LAMBDA_FUNCTION_NAME", defaultValue) +} + func printEndReports(invokeId string, initDuration string, memorySize string, invokeStart time.Time, timeoutDuration time.Duration) { // Calcuation invoke duration invokeDuration := math.Min(float64(time.Now().Sub(invokeStart).Nanoseconds()), @@ -118,7 +126,7 @@ func InvokeHandler(w http.ResponseWriter, r *http.Request, sandbox Sandbox, bs i invokeStart := time.Now() invokePayload := &interop.Invoke{ ID: uuid.New().String(), - InvokedFunctionArn: fmt.Sprintf("arn:aws:lambda:us-east-1:012345678912:function:%s", GetenvWithDefault("AWS_LAMBDA_FUNCTION_NAME", "test_function")), + InvokedFunctionArn: fmt.Sprintf("arn:aws:lambda:us-east-1:012345678912:function:%s", GetFunctionName()), TraceID: r.Header.Get("X-Amzn-Trace-Id"), LambdaSegmentID: r.Header.Get("X-Amzn-Segment-Id"), Payload: bytes.NewReader(bodyBytes), @@ -198,7 +206,7 @@ func InitHandler(sandbox Sandbox, functionVersion string, timeout int64, bs inte additionalFunctionEnvironmentVariables["AWS_LAMBDA_LOG_STREAM_NAME"] = "$LATEST" additionalFunctionEnvironmentVariables["AWS_LAMBDA_FUNCTION_VERSION"] = "$LATEST" additionalFunctionEnvironmentVariables["AWS_LAMBDA_FUNCTION_MEMORY_SIZE"] = "3008" - additionalFunctionEnvironmentVariables["AWS_LAMBDA_FUNCTION_NAME"] = "test_function" + additionalFunctionEnvironmentVariables["AWS_LAMBDA_FUNCTION_NAME"] = GetFunctionName() // Forward Env Vars from the running system (container) to what the function can view. Without this, Env Vars will // not be viewable when the function runs. @@ -216,7 +224,7 @@ func InitHandler(sandbox Sandbox, functionVersion string, timeout int64, bs inte AwsSecret: os.Getenv("AWS_SECRET_ACCESS_KEY"), AwsSession: os.Getenv("AWS_SESSION_TOKEN"), XRayDaemonAddress: "0.0.0.0:0", // TODO - FunctionName: GetenvWithDefault("AWS_LAMBDA_FUNCTION_NAME", "test_function"), + FunctionName: GetFunctionName(), FunctionVersion: functionVersion, RuntimeInfo: interop.RuntimeInfo{ ImageJSON: "{}", diff --git a/test/integration/testdata/main.py b/test/integration/testdata/main.py index 9757be8..2dd3a2f 100644 --- a/test/integration/testdata/main.py +++ b/test/integration/testdata/main.py @@ -25,13 +25,13 @@ def check_env_var_handler(event, context): def assert_env_var_is_overwritten(event, context): print(os.environ.get("AWS_LAMBDA_FUNCTION_NAME")) - if os.environ.get("AWS_LAMBDA_FUNCTION_NAME") == "test_function": + if os.environ.get("AWS_LAMBDA_FUNCTION_NAME") == "function": raise("Function name was not overwritten") else: return "My lambda ran succesfully" def assert_lambda_arn_in_context(event, context): - if context.invoked_function_arn == f"arn:aws:lambda:us-east-1:012345678912:function:{os.environ.get('AWS_LAMBDA_FUNCTION_NAME', 'test_function')}": + if context.invoked_function_arn == f"arn:aws:lambda:us-east-1:012345678912:function:{os.environ.get('AWS_LAMBDA_FUNCTION_NAME', 'function')}": return "My lambda ran succesfully" else: raise("Function Arn was not there")