{"id":26638161,"url":"https://github.com/johnmanko/lamb-dahahah","last_synced_at":"2026-04-08T18:02:15.761Z","repository":{"id":280909883,"uuid":"942350408","full_name":"johnmanko/lamb-dahahah","owner":"johnmanko","description":"Various Lambda functions and Terraform configurations for deploying them. ","archived":false,"fork":false,"pushed_at":"2025-03-10T00:42:38.000Z","size":12478,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-14T07:40:18.101Z","etag":null,"topics":["angular","aws-lambda","localstack","terraform"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/johnmanko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-04T01:16:24.000Z","updated_at":"2025-03-10T00:42:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"0d0c8202-0db6-4e90-8406-eae18a692011","html_url":"https://github.com/johnmanko/lamb-dahahah","commit_stats":null,"previous_names":["johnmanko/lamb-dahahah"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/johnmanko/lamb-dahahah","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnmanko%2Flamb-dahahah","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnmanko%2Flamb-dahahah/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnmanko%2Flamb-dahahah/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnmanko%2Flamb-dahahah/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/johnmanko","download_url":"https://codeload.github.com/johnmanko/lamb-dahahah/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnmanko%2Flamb-dahahah/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31567227,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","aws-lambda","localstack","terraform"],"created_at":"2025-03-24T17:25:24.641Z","updated_at":"2026-04-08T18:02:15.749Z","avatar_url":"https://github.com/johnmanko.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Lamb-dahahah](./header.webp \"Lamb-dahahah\")\n\n## Preparation\n\nInstall any dependencies (if your function uses external libraries). Use a virtual environment for this:\n\n```\npython3 -m venv .venv\nsource .venv/bin/activate\n```\n\n### Terraform Create/Update\n\nReview the Terraform AWS Provider [documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) for details on how to configure resources.\n\nInstall `OpenTofu` and `terraform-local` (if using [LocalStack](https://www.localstack.cloud/))\n```shell\nbrew install opentofu\nbrew install terraform-local\n```\n\nCustomize `example.tfvars`:\n```terraform\naws_region = \"us-east-2\"\ns3_bucket_name = \"my_bucket_name\"\ns3_bucket_key_prefix = \"logs/\"\ncloudwatch_log_group_name = \"/aws/lambda/{function_name}\"\ncloudwatch_log_match_regex = \"(?i)Billed\"\n```\n\nFrom within `./terraform`, initialize the state:\n```shell\ncd ./terraform\ntofu init\n```\n\nValidate the IaS:\n```shell\ntofu validate -var-file dev.tfvars\nSuccess! The configuration is valid.\n```\n\nView the provisioning plan:\n```shell\ntofu plan -var-files=dev.tfvars\n```\n\nor \n\n```shell\nTF_CMD=tofu tflocal plan -var-file=dev.tfvars\n```\n\nIf using LocalStack, you can apply like such:\n```shell\nTF_CMD=tofu tflocal apply -var-file=dev.tfvars\n```\n\n---\n\n\u003cdetails\u003e\n  \u003csummary\u003eExpand To View \"apply\" Output\u003c/summary\u003e\n\n```shell\nmodule.lambdas.data.archive_file.lambda_zip: Reading...\nmodule.lambdas.data.archive_file.lambda_zip: Read complete after 0s [id=9e3a86ffbe84d62d4991d3ec98129bc938f30eac]\n\nOpenTofu used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:\n  + create\n\nOpenTofu will perform the following actions:\n\n  # module.iam_roles.aws_iam_role.lambda_role will be created\n  + resource \"aws_iam_role\" \"lambda_role\" {\n      + arn                   = (known after apply)\n      + assume_role_policy    = jsonencode(\n            {\n              + Statement = [\n                  + {\n                      + Action    = \"sts:AssumeRole\"\n                      + Effect    = \"Allow\"\n                      + Principal = {\n                          + Service = \"lambda.amazonaws.com\"\n                        }\n                    },\n                ]\n              + Version   = \"2012-10-17\"\n            }\n        )\n      + create_date           = (known after apply)\n      + force_detach_policies = false\n      + id                    = (known after apply)\n      + managed_policy_arns   = (known after apply)\n      + max_session_duration  = 3600\n      + name                  = \"portfolio-lambdahahah-lambda-role\"\n      + name_prefix           = (known after apply)\n      + path                  = \"/\"\n      + tags                  = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + tags_all              = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + unique_id             = (known after apply)\n\n      + inline_policy (known after apply)\n    }\n\n  # module.lambdas.module.bucket-list_lambda.aws_lambda_function.lambda_function will be created\n  + resource \"aws_lambda_function\" \"lambda_function\" {\n      + architectures                  = (known after apply)\n      + arn                            = (known after apply)\n      + code_sha256                    = (known after apply)\n      + filename                       = \"./lambda.zip\"\n      + function_name                  = \"lambdahahah-bucket-list\"\n      + handler                        = \"lambda.lambda_handler\"\n      + id                             = (known after apply)\n      + invoke_arn                     = (known after apply)\n      + last_modified                  = (known after apply)\n      + memory_size                    = 128\n      + package_type                   = \"Zip\"\n      + publish                        = false\n      + qualified_arn                  = (known after apply)\n      + qualified_invoke_arn           = (known after apply)\n      + reserved_concurrent_executions = -1\n      + role                           = (known after apply)\n      + runtime                        = \"python3.12\"\n      + signing_job_arn                = (known after apply)\n      + signing_profile_version_arn    = (known after apply)\n      + skip_destroy                   = false\n      + source_code_hash               = \"o9Q3GTobgPf881UpTgn33oi65MnFCYZjG0ZcSDZ0xm4=\"\n      + source_code_size               = (known after apply)\n      + tags                           = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + tags_all                       = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + timeout                        = 3\n      + version                        = (known after apply)\n\n      + environment {\n          + variables = {\n              + \"BUCKET_KEY_PREFIX\" = \"logs/\"\n              + \"BUCKET_NAME\"       = \"com.johnmanko.portfolio.lambdahahah\"\n            }\n        }\n\n      + ephemeral_storage (known after apply)\n\n      + logging_config (known after apply)\n\n      + tracing_config (known after apply)\n    }\n\n  # module.lambdas.module.bucket-read_lambda.aws_lambda_function.lambda_function will be created\n  + resource \"aws_lambda_function\" \"lambda_function\" {\n      + architectures                  = (known after apply)\n      + arn                            = (known after apply)\n      + code_sha256                    = (known after apply)\n      + filename                       = \"./lambda.zip\"\n      + function_name                  = \"lambdahahah-bucket-read\"\n      + handler                        = \"lambda.lambda_handler\"\n      + id                             = (known after apply)\n      + invoke_arn                     = (known after apply)\n      + last_modified                  = (known after apply)\n      + memory_size                    = 128\n      + package_type                   = \"Zip\"\n      + publish                        = false\n      + qualified_arn                  = (known after apply)\n      + qualified_invoke_arn           = (known after apply)\n      + reserved_concurrent_executions = -1\n      + role                           = (known after apply)\n      + runtime                        = \"python3.12\"\n      + signing_job_arn                = (known after apply)\n      + signing_profile_version_arn    = (known after apply)\n      + skip_destroy                   = false\n      + source_code_hash               = \"o9Q3GTobgPf881UpTgn33oi65MnFCYZjG0ZcSDZ0xm4=\"\n      + source_code_size               = (known after apply)\n      + tags                           = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + tags_all                       = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + timeout                        = 3\n      + version                        = (known after apply)\n\n      + environment {\n          + variables = {\n              + \"BUCKET_NAME\" = \"com.johnmanko.portfolio.lambdahahah\"\n            }\n        }\n\n      + ephemeral_storage (known after apply)\n\n      + logging_config (known after apply)\n\n      + tracing_config (known after apply)\n    }\n\n  # module.lambdas.module.hello_lambda.aws_lambda_function.lambda_function will be created\n  + resource \"aws_lambda_function\" \"lambda_function\" {\n      + architectures                  = (known after apply)\n      + arn                            = (known after apply)\n      + code_sha256                    = (known after apply)\n      + filename                       = \"./lambda.zip\"\n      + function_name                  = \"lambdahahah-hello\"\n      + handler                        = \"lambda.lambda_handler\"\n      + id                             = (known after apply)\n      + invoke_arn                     = (known after apply)\n      + last_modified                  = (known after apply)\n      + memory_size                    = 128\n      + package_type                   = \"Zip\"\n      + publish                        = false\n      + qualified_arn                  = (known after apply)\n      + qualified_invoke_arn           = (known after apply)\n      + reserved_concurrent_executions = -1\n      + role                           = (known after apply)\n      + runtime                        = \"python3.12\"\n      + signing_job_arn                = (known after apply)\n      + signing_profile_version_arn    = (known after apply)\n      + skip_destroy                   = false\n      + source_code_hash               = \"o9Q3GTobgPf881UpTgn33oi65MnFCYZjG0ZcSDZ0xm4=\"\n      + source_code_size               = (known after apply)\n      + tags                           = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + tags_all                       = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + timeout                        = 3\n      + version                        = (known after apply)\n\n      + environment {\n          + variables = {\n              + \"NOT_USED\" = \"NOT_USED\"\n            }\n        }\n\n      + ephemeral_storage (known after apply)\n\n      + logging_config (known after apply)\n\n      + tracing_config (known after apply)\n    }\n\n  # module.lambdas.module.logread_lambda.aws_lambda_function.lambda_function will be created\n  + resource \"aws_lambda_function\" \"lambda_function\" {\n      + architectures                  = (known after apply)\n      + arn                            = (known after apply)\n      + code_sha256                    = (known after apply)\n      + filename                       = \"./lambda.zip\"\n      + function_name                  = \"lambdahahah-logread\"\n      + handler                        = \"lambda.lambda_handler\"\n      + id                             = (known after apply)\n      + invoke_arn                     = (known after apply)\n      + last_modified                  = (known after apply)\n      + memory_size                    = 128\n      + package_type                   = \"Zip\"\n      + publish                        = false\n      + qualified_arn                  = (known after apply)\n      + qualified_invoke_arn           = (known after apply)\n      + reserved_concurrent_executions = -1\n      + role                           = (known after apply)\n      + runtime                        = \"python3.12\"\n      + signing_job_arn                = (known after apply)\n      + signing_profile_version_arn    = (known after apply)\n      + skip_destroy                   = false\n      + source_code_hash               = \"o9Q3GTobgPf881UpTgn33oi65MnFCYZjG0ZcSDZ0xm4=\"\n      + source_code_size               = (known after apply)\n      + tags                           = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + tags_all                       = {\n          + \"App\"         = \"Lambdahahah\"\n          + \"AppGroup\"    = \"Portfolio\"\n          + \"Environment\" = \"dev\"\n          + \"Owner\"       = \"John Manko\"\n          + \"Repo\"        = \"lamb-dahahah\"\n        }\n      + timeout                        = 3\n      + version                        = (known after apply)\n\n      + environment {\n          + variables = {\n              + \"LOG_GROUP_NAME\" = \"/aws/lambda/lambdahahah_hello\"\n              + \"REGEX_PATTERN\"  = \"(?i)Billed\"\n            }\n        }\n\n      + ephemeral_storage (known after apply)\n\n      + logging_config (known after apply)\n\n      + tracing_config (known after apply)\n    }\n\nPlan: 5 to add, 0 to change, 0 to destroy.\n\nChanges to Outputs:\n  + lambda_bucket-list_lambda_function_arn  = (known after apply)\n  + lambda_bucket-list_lambda_function_name = \"lambdahahah-bucket-list\"\n  + lambda_bucket-read_lambda_function_arn  = (known after apply)\n  + lambda_bucket-read_lambda_function_name = \"lambdahahah-bucket-read\"\n  + lambda_hello_lambda_function_arn        = (known after apply)\n  + lambda_hello_lambda_function_name       = \"lambdahahah-hello\"\n  + lambda_logread_lambda_function_arn      = (known after apply)\n  + lambda_logread_lambda_function_name     = \"lambdahahah-logread\"\n  + lambda_role_arn                         = (known after apply)\n\nDo you want to perform these actions?\n  OpenTofu will perform the actions described above.\n  Only 'yes' will be accepted to approve.\n\n  Enter a value: yes \n\nmodule.iam_roles.aws_iam_role.lambda_role: Creating...\nmodule.iam_roles.aws_iam_role.lambda_role: Creation complete after 0s [id=portfolio-lambdahahah-lambda-role]\nmodule.lambdas.module.hello_lambda.aws_lambda_function.lambda_function: Creating...\nmodule.lambdas.module.logread_lambda.aws_lambda_function.lambda_function: Creating...\nmodule.lambdas.module.bucket-list_lambda.aws_lambda_function.lambda_function: Creating...\nmodule.lambdas.module.bucket-read_lambda.aws_lambda_function.lambda_function: Creating...\nmodule.lambdas.module.bucket-read_lambda.aws_lambda_function.lambda_function: Creation complete after 5s [id=lambdahahah-bucket-read]\nmodule.lambdas.module.hello_lambda.aws_lambda_function.lambda_function: Still creating... [10s elapsed]\nmodule.lambdas.module.logread_lambda.aws_lambda_function.lambda_function: Still creating... [10s elapsed]\nmodule.lambdas.module.bucket-list_lambda.aws_lambda_function.lambda_function: Still creating... [10s elapsed]\nmodule.lambdas.module.hello_lambda.aws_lambda_function.lambda_function: Creation complete after 10s [id=lambdahahah-hello]\nmodule.lambdas.module.logread_lambda.aws_lambda_function.lambda_function: Creation complete after 16s [id=lambdahahah-logread]\nmodule.lambdas.module.bucket-list_lambda.aws_lambda_function.lambda_function: Still creating... [20s elapsed]\nmodule.lambdas.module.bucket-list_lambda.aws_lambda_function.lambda_function: Creation complete after 21s [id=lambdahahah-bucket-list]\n\nApply complete! Resources: 5 added, 0 changed, 0 destroyed.\n\nOutputs:\n\nlambda_bucket-list_lambda_function_arn = \"arn:aws:lambda:us-east-2:000000000000:function:lambdahahah-bucket-list\"\nlambda_bucket-list_lambda_function_name = \"lambdahahah-bucket-list\"\nlambda_bucket-read_lambda_function_arn = \"arn:aws:lambda:us-east-2:000000000000:function:lambdahahah-bucket-read\"\nlambda_bucket-read_lambda_function_name = \"lambdahahah-bucket-read\"\nlambda_hello_lambda_function_arn = \"arn:aws:lambda:us-east-2:000000000000:function:lambdahahah-hello\"\nlambda_hello_lambda_function_name = \"lambdahahah-hello\"\nlambda_logread_lambda_function_arn = \"arn:aws:lambda:us-east-2:000000000000:function:lambdahahah-logread\"\nlambda_logread_lambda_function_name = \"lambdahahah-logread\"\nlambda_role_arn = \"arn:aws:iam::000000000000:role/portfolio-lambdahahah-lambda-role\"\n```\n\u003c/details\u003e\n\n---\n\nUpdate the function(s) with the correct code:\n```shell\n./lambda-install.sh hello\n./lambda-install.sh logread\n./lambda-install.sh bucket-list\n./lambda-install.sh bucket-read\n```\n\nTest:\n```shell\nawslocal lambda invoke --function-name lambdahahah-hello results.json\ncat results.json\n```\n\n```shell\nawslocal s3 ls\n2025-03-06 01:28:46 my_bucket_name\n```\n\n```shell\nawslocal s3 ls s3://my_bucket_name --recursive\n2025-03-06 12:48:23      20746 logs/server_01.log\n2025-03-06 12:48:23      20743 logs/server_02.log\n2025-03-06 12:48:23      21060 logs/server_03.log\n2025-03-06 12:48:23      21135 logs/server_04.log\n2025-03-06 12:48:23      20701 logs/server_05.log\n2025-03-06 12:48:23      20604 logs/server_06.log\n2025-03-06 12:48:23      20817 logs/server_07.log\n2025-03-06 12:48:23      20994 logs/server_08.log\n2025-03-06 12:48:23      20934 logs/server_09.log\n2025-03-06 12:48:23      20943 logs/server_10.log\n2025-03-06 12:48:23      20885 logs/server_11.log\n2025-03-06 12:48:23      20872 logs/server_12.log\n2025-03-06 12:48:23      20920 logs/server_13.log\n2025-03-06 12:48:23      21055 logs/server_14.log\n2025-03-06 12:48:23      20569 logs/server_15.log\n2025-03-06 12:48:23      21017 logs/server_16.log\n2025-03-06 12:48:23      21193 logs/server_17.log\n2025-03-06 12:48:23      20696 logs/server_18.log\n2025-03-06 12:48:23      20782 logs/server_19.log\n2025-03-06 12:48:23      20918 logs/server_20.log\n```\n\n### Manually Create/Update\n\nAvailable Lambda functions:\n\n* `hello` - A randomized multilingual \"Hello World\"\n* `bucket-list` - Lists objects in a pre-defined bucket and prefix\n* `bucket-read` - Reads an object from a pre-defined bucket\n* `logread` - Reads CloudWatch logs \n\n```shell\nAWS_CMD=\"awslocal\" ./lambda-install.sh hello\narn:aws:iam::000000000000:role/lambdahahah-execution-role\n\n[notice] A new release of pip is available: 25.0 -\u003e 25.0.1\n[notice] To update, run: pip install --upgrade pip\n  adding: lambda.py (deflated 55%)\n  adding: lib/ (stored 0%)\n  adding: lib/translations.py (deflated 32%)\n{\n    \"FunctionName\": \"lambdahahah-hello\",\n    \"FunctionArn\": \"arn:aws:lambda:us-east-2:000000000000:function:lambdahahah-hello\",\n    \"Runtime\": \"python3.12\",\n    \"Role\": \"arn:aws:iam::000000000000:role/lambdahahah-execution-role\",\n    \"Handler\": \"lambda.lambda_handler\",\n    \"CodeSize\": 1392,\n    \"Description\": \"\",\n    \"Timeout\": 3,\n    \"MemorySize\": 128,\n    \"LastModified\": \"2025-03-05T23:53:11.658613+0000\",\n    \"CodeSha256\": \"atzrszSMPN66m/6hJyQL9kzoE87HiccG6iWiXPVD+5A=\",\n    \"Version\": \"$LATEST\",\n    \"Environment\": {\n        \"Variables\": {\n            \"UNUSED_ENV_VAR\": \"unused\"\n        }\n    },\n    \"TracingConfig\": {\n        \"Mode\": \"PassThrough\"\n    },\n    \"RevisionId\": \"845fe971-3ff8-4222-baa3-5d082cc9ede6\",\n    \"State\": \"Pending\",\n    \"StateReason\": \"The function is being created.\",\n    \"StateReasonCode\": \"Creating\",\n    \"PackageType\": \"Zip\",\n    \"Architectures\": [\n        \"x86_64\"\n    ],\n    \"EphemeralStorage\": {\n        \"Size\": 512\n    },\n    \"SnapStart\": {\n        \"ApplyOn\": \"None\",\n        \"OptimizationStatus\": \"Off\"\n    },\n    \"RuntimeVersionConfig\": {\n        \"RuntimeVersionArn\": \"arn:aws:lambda:us-east-2::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1\"\n    },\n    \"LoggingConfig\": {\n        \"LogFormat\": \"Text\",\n        \"LogGroup\": \"/aws/lambda/lambdahahah-hello\"\n    }\n}\n```\n\n## Verify\n\n1. Check the function details to verify that it was created successfully:\n\n```shell\nawslocal lambda list-functions  --query 'Functions[].{Name:FunctionName, Runtime:Runtime}' --output table\n\n-------------------------------------------\n|              ListFunctions              |\n+--------------------------+--------------+\n|           Name           |   Runtime    |\n+--------------------------+--------------+\n|  lambdahahah-bucket-read |  python3.12  |\n|  lambdahahah-hello       |  python3.12  |\n|  lambdahahah-logread     |  python3.12  |\n|  lambdahahah-bucket-list |  python3.12  |\n+--------------------------+--------------+\n```\n\n2. Invoke the function to test it:\n\n```shell\nawslocal lambda invoke --function-name lambdahahah-hello results.json\n{\n    \"StatusCode\": 200,\n    \"ExecutedVersion\": \"$LATEST\"\n}\ncat results.json\n{\"translation\": \"こんにちは、世界！\", \"language\": \"Japanese\", \"requestId\": \"5b6cb3b9-2b97-43f2-aa05-885e9971948d\"}%\n```\n\n```shell\nawslocal lambda invoke --function-name lambdahahah-bucket-list results.json\ncat results.json | jq .\n{\n  \"statusCode\": 200,\n  \"headers\": {\n    \"Content-Type\": \"application/json\",\n    \"Access-Control-Allow-Origin\": \"*\",\n    \"Access-Control-Allow-Headers\": \"Content-Type\",\n    \"Access-Control-Allow-Methods\": \"OPTIONS,GET\"\n  },\n  \"body\": \"[{\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20746, \\\"key\\\": \\\"logs/server_01.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20743, \\\"key\\\": \\\"logs/server_02.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 21060, \\\"key\\\": \\\"logs/server_03.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 21135, \\\"key\\\": \\\"logs/server_04.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20701, \\\"key\\\": \\\"logs/server_05.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20604, \\\"key\\\": \\\"logs/server_06.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20817, \\\"key\\\": \\\"logs/server_07.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20994, \\\"key\\\": \\\"logs/server_08.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20934, \\\"key\\\": \\\"logs/server_09.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20943, \\\"key\\\": \\\"logs/server_10.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20885, \\\"key\\\": \\\"logs/server_11.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20872, \\\"key\\\": \\\"logs/server_12.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20920, \\\"key\\\": \\\"logs/server_13.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 21055, \\\"key\\\": \\\"logs/server_14.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20569, \\\"key\\\": \\\"logs/server_15.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 21017, \\\"key\\\": \\\"logs/server_16.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 21193, \\\"key\\\": \\\"logs/server_17.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20696, \\\"key\\\": \\\"logs/server_18.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20782, \\\"key\\\": \\\"logs/server_19.log\\\"}, {\\\"lastModified\\\": \\\"2025-03-06T17:48:23+00:00\\\", \\\"size\\\": 20918, \\\"key\\\": \\\"logs/server_20.log\\\"}]\"\n}\n```\n\n3. Clean up\n\n```shell\nawslocal lambda delete-function --function-name lambdahahah-hello\nawslocal iam delete-role --role-name lambdahahah-execution-role\n```\n\n## Angular UI\n\nThere's an included Angular UI for playing with the deployed lambdas, but it's configured with LocalStack function urls.\n\n### Hello\n![Lambda Hello](./assets/lambda-hello.png)\n\n### CloudWatch Events Logread\n![Lambda Logread](./assets/lambda-logread.png)\n\n### Bucket List and Object Read\n![Lambda Bucket List and Read](./assets/lambda-bucket-read.png)\n\n\n## Troubleshooting\n\nA few command for inspecting deployments.  See the full [AWS CLI Command Reference¶](https://awscli.amazonaws.com/v2/documentation/api/latest/index.html).\n\n```shell\nawslocal lambda list-functions  --query 'Functions[].{Name:FunctionName, Runtime:Runtime}' --output table\n```\n```shell\nawslocal lambda invoke --function-name hello results.json\n```\n```shell\nawslocal iam list-roles\n```\n```shell\nawslocal iam get-role --role-name portfolio-lambdahahah-lambda-role --query 'Role.Arn'\n```\n```shell\nawslocal s3 ls\n```\n```shell\nawslocal s3 ls com.johnmanko.portfolio.lambdahahah\n```\n```shell\nawslocal s3 ls s3://com.johnmanko.portfolio.lambdahahah --recursive\n```\n```shell\nawslocal logs describe-log-groups\n```\n```shell\nawslocal logs tail /aws/lambda/lambdahahah-hello --follow\\n\n```\n```shell\nawslocal lambda get-function --function-name lambdahahah-logread\n```\n```shell\nawslocal s3api head-object --bucket com.johnmanko.portfolio.lambdahahah --key logs/server_20.log\n```\n\n# Handler Parameters\n\nThe lambda handler accepts two parameters: `event` and `context`.\n\n## `event` Object\n\nEvent Object Properties\n\nThe `event` object contains the input data that triggers the Lambda function. The structure and properties of the `event` object depend on the source of the invocation (e.g., API Gateway, S3, DynamoDB, etc.). Here are some common examples:\n\n1. API Gateway Invocation:\n\n* `httpMethod`: The HTTP method used (GET, POST, etc.).\n* `path`: The path of the request.\n* `headers`: A dictionary of HTTP headers.\n* `queryStringParameters`: A dictionary of query string parameters.\n* `body`: The body of the request (usually a JSON string).\n\n2. S3 Event:\n\n* `Records`: A list of records containing details about the S3 bucket and the object (e.g., bucket name, object key).\n\n3. DynamoDB Stream Event:\n\n* `Records`: A list of records, each containing details about changes to items in the DynamoDB table.\n\n4. CloudWatch Events:\n\n* `detail`: Details about the event that triggered the Lambda function.\n\nExample of Event Object in API Gateway\n\nHere’s an example of how the event object might look when invoked via API Gateway:\n\n```json\n{\n    \"httpMethod\": \"POST\",\n    \"path\": \"/example\",\n    \"headers\": {\n        \"Content-Type\": \"application/json\"\n    },\n    \"queryStringParameters\": {\n        \"key\": \"value\"\n    },\n    \"body\": \"{\\\"key\\\": \\\"value\\\"}\"\n}\n```\n\n## `context` Object\n\nThe `context` object contains information about the invocation, function, and execution environment. Key properties include:\n\n* `aws_request_id`: A unique identifier for the invocation.\n* `function_name`: The name of the Lambda function.\n* `function_version`: The version of the function being invoked.\n* `invoked_function_arn`: The ARN (Amazon Resource Name) of the function being invoked.\n* `memory_limit_in_mb`: The amount of memory allocated to the function.\n* `remaining_time_in_millis`: The amount of time remaining before the function times out (in milliseconds).\n* `log_group_name`: The name of the CloudWatch log group for the function.\n* `log_stream_name`: The name of the CloudWatch log stream for the current invocation.\n* `identity`: Information about the Amazon Cognito identity (if applicable).\n* `client_context`: Information about the client that invoked the function (if applicable).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnmanko%2Flamb-dahahah","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjohnmanko%2Flamb-dahahah","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnmanko%2Flamb-dahahah/lists"}