From e6399c8d3038142d549157b18f44eceaeec7551f Mon Sep 17 00:00:00 2001 From: Santiago Lo Coco <slococo@itba.edu.ar> Date: Sat, 29 Oct 2022 09:17:44 -0300 Subject: [PATCH] Add apigw method and update frontend --- terraform/modules/apigw/main.tf | 75 +++++- terraform/modules/apigw/variables.tf | 14 +- terraform/organization/apigw.tf | 17 +- terraform/organization/datasources.tf | 9 +- terraform/organization/html/index.html | 241 +++++++++++++----- terraform/organization/lambda.tf | 4 +- terraform/organization/locals.tf | 15 +- terraform/organization/sqs.tf | 2 +- terraform/organization/vpc.tf | 57 +---- terraform/resources/html/index.html | 47 ---- terraform/resources/lambda/lambdaDB.zip | Bin 0 -> 481 bytes .../lambda/lambdaDB/lambda_handler.py | 26 ++ .../lambda/{lambda.zip => lambdaSQS.zip} | Bin .../lambda/{ => lambdaSQS}/lambda_handler.py | 0 14 files changed, 312 insertions(+), 195 deletions(-) delete mode 100644 terraform/resources/html/index.html create mode 100644 terraform/resources/lambda/lambdaDB.zip create mode 100644 terraform/resources/lambda/lambdaDB/lambda_handler.py rename terraform/resources/lambda/{lambda.zip => lambdaSQS.zip} (100%) rename terraform/resources/lambda/{ => lambdaSQS}/lambda_handler.py (100%) diff --git a/terraform/modules/apigw/main.tf b/terraform/modules/apigw/main.tf index 3a6bc13..ed2906a 100644 --- a/terraform/modules/apigw/main.tf +++ b/terraform/modules/apigw/main.tf @@ -9,11 +9,18 @@ resource "aws_api_gateway_rest_api" "this" { } resource "aws_api_gateway_resource" "this" { - path_part = "resource" + path_part = "products" parent_id = aws_api_gateway_rest_api.this.root_resource_id rest_api_id = aws_api_gateway_rest_api.this.id } +resource "aws_api_gateway_method" "stock_get" { + rest_api_id = aws_api_gateway_rest_api.this.id + resource_id = aws_api_gateway_resource.this.id + http_method = "GET" + authorization = "NONE" +} + resource "aws_api_gateway_method" "this" { rest_api_id = aws_api_gateway_rest_api.this.id resource_id = aws_api_gateway_resource.this.id @@ -28,6 +35,15 @@ resource "aws_api_gateway_method" "options" { authorization = "NONE" } +resource "aws_api_gateway_integration" "stock_get" { + rest_api_id = aws_api_gateway_rest_api.this.id + resource_id = aws_api_gateway_resource.this.id + http_method = aws_api_gateway_method.stock_get.http_method + integration_http_method = "POST" + type = "AWS_PROXY" + uri = var.lambda[1].lambda_function_arn +} + resource "aws_api_gateway_integration" "this" { rest_api_id = aws_api_gateway_rest_api.this.id resource_id = aws_api_gateway_resource.this.id @@ -67,7 +83,6 @@ resource "aws_api_gateway_integration" "options" { rest_api_id = aws_api_gateway_rest_api.this.id resource_id = aws_api_gateway_resource.this.id http_method = aws_api_gateway_method.options.http_method - # integration_http_method = "OPTIONS" type = "MOCK" request_parameters = {} @@ -90,8 +105,10 @@ resource "aws_api_gateway_deployment" "this" { aws_api_gateway_resource.this.id, aws_api_gateway_method.this.id, aws_api_gateway_method.options.id, + aws_api_gateway_method.stock_get.id, aws_api_gateway_integration.this.id, aws_api_gateway_integration.options.id, + aws_api_gateway_integration.stock_get.id, ])) } @@ -102,8 +119,16 @@ resource "aws_api_gateway_deployment" "this" { depends_on = [ aws_api_gateway_integration.options, aws_api_gateway_integration.this, + aws_api_gateway_integration.stock_get, aws_api_gateway_method.options, - aws_api_gateway_method.this + aws_api_gateway_method.this, + aws_api_gateway_method.stock_get, + aws_api_gateway_method_response.options200, + aws_api_gateway_method_response.http200, + aws_api_gateway_method_response.stock200, + aws_api_gateway_integration_response.options200, + aws_api_gateway_integration_response.http200, + aws_api_gateway_integration_response.stock200, ] } @@ -120,12 +145,25 @@ resource "aws_api_gateway_method_response" "http200" { status_code = 200 response_parameters = { - "method.response.header.Access-Control-Allow-Origin" = "false" + "method.response.header.Access-Control-Allow-Origin" = "true" } depends_on = [aws_api_gateway_method.this] } +resource "aws_api_gateway_method_response" "stock200" { + rest_api_id = aws_api_gateway_rest_api.this.id + resource_id = aws_api_gateway_resource.this.id + http_method = aws_api_gateway_method.stock_get.http_method + status_code = 200 + + response_parameters = { + "method.response.header.Access-Control-Allow-Origin" = "true" + } + + depends_on = [aws_api_gateway_method.stock_get] +} + resource "aws_api_gateway_method_response" "options200" { rest_api_id = aws_api_gateway_rest_api.this.id resource_id = aws_api_gateway_resource.this.id @@ -136,9 +174,9 @@ resource "aws_api_gateway_method_response" "options200" { } response_parameters = { - "method.response.header.Access-Control-Allow-Headers" = false, - "method.response.header.Access-Control-Allow-Methods" = false, - "method.response.header.Access-Control-Allow-Origin" = false + "method.response.header.Access-Control-Allow-Headers" = true, + "method.response.header.Access-Control-Allow-Methods" = true, + "method.response.header.Access-Control-Allow-Origin" = true } depends_on = [aws_api_gateway_method.options] @@ -157,6 +195,19 @@ resource "aws_api_gateway_integration_response" "http200" { depends_on = [aws_api_gateway_method_response.http200] } +resource "aws_api_gateway_integration_response" "stock200" { + rest_api_id = aws_api_gateway_rest_api.this.id + resource_id = aws_api_gateway_resource.this.id + http_method = aws_api_gateway_method.stock_get.http_method + status_code = aws_api_gateway_method_response.stock200.status_code + selection_pattern = "^2[0-9][0-9]" + response_parameters = { + "method.response.header.Access-Control-Allow-Origin" = "'*'" + } + + depends_on = [aws_api_gateway_method_response.stock200] +} + resource "aws_api_gateway_integration_response" "options200" { rest_api_id = aws_api_gateway_rest_api.this.id resource_id = aws_api_gateway_resource.this.id @@ -164,9 +215,17 @@ resource "aws_api_gateway_integration_response" "options200" { status_code = aws_api_gateway_method_response.http200.status_code response_parameters = { "method.response.header.Access-Control-Allow-Headers" = "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'", - "method.response.header.Access-Control-Allow-Methods" = "'OPTIONS,POST'", + "method.response.header.Access-Control-Allow-Methods" = "'GET,OPTIONS,POST'", "method.response.header.Access-Control-Allow-Origin" = "'*'" } depends_on = [aws_api_gateway_method_response.options200] } + +resource "aws_lambda_permission" "this" { + statement_id = "AllowExecutionFromAPIGateway" + action = "lambda:InvokeFunction" + function_name = var.lambda[1].lambda_function_name + principal = "apigateway.amazonaws.com" + source_arn = "${var.lambda[1].lambda_source_arn}:${aws_api_gateway_rest_api.this.id}/*/${aws_api_gateway_method.stock_get.http_method}${aws_api_gateway_resource.this.path}" +} diff --git a/terraform/modules/apigw/variables.tf b/terraform/modules/apigw/variables.tf index 300157c..b4b9cc0 100644 --- a/terraform/modules/apigw/variables.tf +++ b/terraform/modules/apigw/variables.tf @@ -28,16 +28,6 @@ variable "role_arn" { type = string } -variable "lambda_function_arn" { - description = "The ARN of the Lambda function." - type = string -} - -variable "lambda_source_arn" { - type = string -} - -variable "lambda_function_name" { - description = "Name of the lambda function" - type = string +variable "lambda" { + type = list(any) } diff --git a/terraform/organization/apigw.tf b/terraform/organization/apigw.tf index 49204f1..f51485f 100644 --- a/terraform/organization/apigw.tf +++ b/terraform/organization/apigw.tf @@ -11,11 +11,20 @@ module "apigw" { name = "AWSAPIGateway-g3" description = "..." - lambda_function_arn = module.lambda["lambda"].lambda_function_arn - lambda_function_name = module.lambda["lambda"].lambda_function_name - lambda_source_arn = "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}" + lambda = [ + { + lambda_function_arn = module.lambda["lambdaSQS"].lambda_function_arn + lambda_function_name = module.lambda["lambdaSQS"].lambda_function_name + lambda_source_arn = "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}" + }, + { + lambda_function_arn = module.lambda["lambdaDB"].lambda_function_arn + lambda_function_name = module.lambda["lambdaDB"].lambda_function_name + lambda_source_arn = "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}" + } + ] + role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/LabRole" - # sqs_arn = "arn:aws:sqs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:AWS-SQS-g3" sqs_arn = "arn:aws:apigateway:${data.aws_region.current.name}:sqs:path/AWS-SQS-g3" tags = { diff --git a/terraform/organization/datasources.tf b/terraform/organization/datasources.tf index ead099e..60cfc70 100644 --- a/terraform/organization/datasources.tf +++ b/terraform/organization/datasources.tf @@ -20,11 +20,16 @@ data "template_file" "userdata" { data "aws_iam_policy_document" "this" { statement { effect = "Allow" - actions = ["dynamodb:PutItem"] + actions = [ + "dynamodb:PutItem", + "dynamodb:Scan", + "dynamodb:GetItem", + "dynamodb:UpdateItem" + ] principals { type = "AWS" identifiers = ["*"] } - resources = ["arn:aws:dynamodb:us-east-1:478157316333:table/AWSDynamoDB-g3"] + resources = ["arn:aws:dynamodb:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:table/AWSDynamoDB-g3"] } } diff --git a/terraform/organization/html/index.html b/terraform/organization/html/index.html index d64fc05..6eed00e 100644 --- a/terraform/organization/html/index.html +++ b/terraform/organization/html/index.html @@ -1,35 +1,39 @@ <!DOCTYPE html> <meta charset="UTF-8"> <html> - <head> - <title>BSMSapp</title> - <div align="center"> - </head> - <div class="d-flex flex-column justify-content-center w-100 h-100"> + +<head> + <title>BSMSapp</title> + <div align="center"> +</head> +<div class="d-flex flex-column justify-content-center w-100 h-100"> + <br><br> + <body bgcolor="#FFFFFF" text="Black"> + <header> + <h1><span id="replace">BSMSapp</span></h1> + </header> + + <form id="myForm" class="form-style"> + <ul> + <li> + <input value="0" name="id" type="number" /> + <span>Enter the product identifier.</span> + </li> + <li> + <input value="0" name="stock" type="number" /> + <span>Enter the new stock number.</span> + </li> + <li> + <input type="submit" value="Upload" /> + </li> + </ul> + </form> + + <button class="style" onclick="get_table()">Get table</button> <br><br> - <body bgcolor="#FFFFFF" text="Black"> - <header> - <h1><span id="replace">BSMSapp</span></h1> - </header> - - - <form id="myForm" class="form-style"> - <ul> - <li> - <input value="0" name="id" type="number"/> - <span>Enter the product identifier.</span> - </li> - <li> - <input value="0" name="stock" type="number"/> - <span>Enter the new stock number.</span> - </li> - <li> - <input type="submit" value="Upload"/> - </li> - </ul> - </form> - </body> - </div> + <table id="table" align="center" border="1px"></table> + </body> +</div> </html> @@ -39,46 +43,86 @@ e.preventDefault(); const formData = new FormData(thisForm).entries() const str = JSON.stringify(Object.fromEntries(formData)) - console.log(str.replace(/\"/g, '')) - const response = await fetch("${ENDPOINT}/resource", { + const response = await fetch("${ENDPOINT}/products", { method: 'POST', - headers: { + headers: { 'Content-Type': 'application/json' }, body: str.replace(/\"/g, '') }); const result = await response.json(); - console.log(result) }); function adjust_textarea(h) { h.style.height = "20px"; - h.style.height = (h.scrollHeight)+"px"; + h.style.height = (h.scrollHeight) + "px"; } + + async function get_table() { + const request = await fetch("${ENDPOINT}/products", { + method: 'GET', + headers: { + 'Content-Type': 'application/json' + } + }); + + const list = await request.json(); + + var cols = []; + for (var i = 0; i < list.length; i++) { + for (var k in list[i]) { + if (cols.indexOf(k) === -1) { + cols.push(k); + } + } + } + + var table = document.createElement("table"); + var tr = table.insertRow(-1); + for (var i = 0; i < cols.length; i++) { + var theader = document.createElement("th"); + theader.innerHTML = cols[i]; + tr.appendChild(theader); + } + + for (var i = 0; i < list.length; i++) { + trow = table.insertRow(-1); + for (var j = 0; j < cols.length; j++) { + var cell = trow.insertCell(-1); + cell.innerHTML = list[i][cols[j]]; + } + } + + var el = document.getElementById("table"); + el.innerHTML = ""; + el.appendChild(table); + } + </script> <style type="text/css"> body { background: linear-gradient(-45deg, #ee7752, #df6493, #23a6d5, #23d5ab); - /* background-color: rgba(0, 0, 0, 0.1); */ background-size: 400% 400%; animation: gradient 15s ease infinite; height: 100vh; } + @keyframes gradient { 0% { background-position: 0% 50%; } - + 50% { background-position: 100% 50%; } - + 100% { background-position: 0% 50%; } } + header h1 { font-size: 70px; font-weight: 600; @@ -87,40 +131,46 @@ background-clip: text; -webkit-background-clip: text; } - .form-style{ - max-width:400px; - margin:50px auto; - background:#fff; - border-radius:2px; - padding:20px; + + .form-style { + max-width: 400px; + margin: 50px auto; + background: #fff; + border-radius: 2px; + padding: 20px; font-family: Georgia, "Times New Roman", Times, serif; } - .form-style h1{ + + .form-style h1 { display: block; text-align: center; padding: 0; margin: 0px 0px 20px 0px; color: #5C5C5C; - font-size:x-large; + font-size: x-large; } - .form-style ul{ - list-style:none; - padding:0; - margin:0; + + .form-style ul { + list-style: none; + padding: 0; + margin: 0; } - .form-style li{ + + .form-style li { display: block; padding: 9px; - border:1px solid #DDDDDD; + border: 1px solid #DDDDDD; margin-bottom: 30px; border-radius: 3px; } - .form-style li:last-child{ - border:none; + + .form-style li:last-child { + border: none; margin-bottom: 0px; text-align: center; } - .form-style li > label{ + + .form-style li>label { display: block; float: left; margin-top: -19px; @@ -132,6 +182,7 @@ overflow: hidden; font-family: Arial, Helvetica, sans-serif; } + .form-style input[type="text"], .form-style input[type="date"], .form-style input[type="datetime"], @@ -142,8 +193,7 @@ .form-style input[type="url"], .form-style input[type="password"], .form-style textarea, - .form-style select - { + .form-style select { box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; @@ -157,6 +207,7 @@ padding: 0; font-family: Georgia, "Times New Roman", Times, serif; } + .form-style input[type="text"]:focus, .form-style input[type="date"]:focus, .form-style input[type="datetime"]:focus, @@ -167,24 +218,25 @@ .form-style input[type="url"]:focus, .form-style input[type="password"]:focus, .form-style textarea:focus, - .form-style select:focus - { - } - .form-style li > span{ + .form-style select:focus {} + + .form-style li>span { background: #F3F3F3; display: block; padding: 3px; margin: 0 -9px -9px -9px; text-align: center; - color: #C0C0C0; + color: #838383; font-family: Arial, Helvetica, sans-serif; font-size: 11px; } - .form-style textarea{ - resize:none; + + .form-style textarea { + resize: none; } + .form-style input[type="submit"], - .form-style input[type="button"]{ + .form-style input[type="button"] { background: #2471FF; border: none; padding: 10px 20px 10px 20px; @@ -192,11 +244,36 @@ border-radius: 3px; color: #D2E2FF; } - .form-style input[type="submit"]:hover, - .form-style input[type="button"]:hover{ - background: #6B9FFF; - color:#fff; + + /* .style { + max-width: 400px; + margin: 50px auto; + background: #fff; + border-radius: 2px; + padding: 20px; + font-family: Georgia, "Times New Roman", Times, serif; + } */ + + .style { + background: #2471FF; + border: none; + padding: 10px 20px 10px 20px; + border-bottom: 3px solid #5994FF; + border-radius: 3px; + color: #D2E2FF; } + + .style:hover { + background: #6B9FFF; + color: #fff; + } + + .form-style input[type="submit"]:hover, + .form-style input[type="button"]:hover { + background: #6B9FFF; + color: #fff; + } + input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; @@ -206,4 +283,34 @@ input[type=number] { -moz-appearance: textfield; } + + table { + border-collapse: collapse; + font-family: Georgia, "Times New Roman", Times, serif; + } + + table td { + padding: 15px; + } + + table thead td { + background-color: #54585d; + color: #ffffff; + font-weight: bold; + font-size: 13px; + border: 1px solid #54585d; + } + + table tbody td { + color: #636363; + border: 1px solid #dddfe1; + } + + table tbody tr { + background-color: #f9fafb; + } + + table tbody tr:nth-child(odd) { + background-color: #ffffff; + } </style> \ No newline at end of file diff --git a/terraform/organization/lambda.tf b/terraform/organization/lambda.tf index 5ce1bc9..4f2ddf2 100644 --- a/terraform/organization/lambda.tf +++ b/terraform/organization/lambda.tf @@ -16,6 +16,6 @@ module "lambda" { package = each.value.package iam_role = each.value.role - vpc_subnet_ids = module.vpc.public_subnets - vpc_security_group_ids = [module.vpc.default_security_group_id] + vpc_subnet_ids = module.vpc.private_subnets + vpc_security_group_ids = [aws_security_group.dynamodb_sg.id] } diff --git a/terraform/organization/locals.tf b/terraform/organization/locals.tf index 976b902..6563032 100644 --- a/terraform/organization/locals.tf +++ b/terraform/organization/locals.tf @@ -1,5 +1,5 @@ locals { - bucket_name = "b123123123123-itba-cloud-computing-g3-test" + bucket_name = "bsmsapp-itba-cloud-computing-g3-test" path = "../resources" s3 = { @@ -33,9 +33,16 @@ locals { } lambdas = { - lambda = { - package = "${local.path}/lambda/lambda.zip" - function_name = "AWSLambdaHandler-${replace(local.bucket_name, "-", "")}" + lambdaSQS = { + package = "${local.path}/lambda/lambdaSQS.zip" + function_name = "AWSLambdaHandlerAPISQSDBg3test" + role = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/LabRole" + handler = "lambda_handler.main" + runtime = "python3.9" + }, + lambdaDB = { + package = "${local.path}/lambda/lambdaDB.zip" + function_name = "AWSLambdaHandlerAPIDBg3test" role = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/LabRole" handler = "lambda_handler.main" runtime = "python3.9" diff --git a/terraform/organization/sqs.tf b/terraform/organization/sqs.tf index fe7a009..52c705a 100644 --- a/terraform/organization/sqs.tf +++ b/terraform/organization/sqs.tf @@ -10,7 +10,7 @@ module "sqs" { ] name = "AWS-SQS-g3" - lambda_name = "AWSLambdaHandler-${replace(local.bucket_name, "-", "")}" + lambda_name = module.lambda["lambdaSQS"].lambda_function_name tags = { name = "SQS" diff --git a/terraform/organization/vpc.tf b/terraform/organization/vpc.tf index e21583d..ea71b4b 100644 --- a/terraform/organization/vpc.tf +++ b/terraform/organization/vpc.tf @@ -3,19 +3,11 @@ locals { { rule_number = 100 rule_action = "allow" - from_port = 80 - to_port = 80 + from_port = 1024 + to_port = 65535 protocol = "tcp" - cidr_block = "10.0.1.0/24" - }, - { - rule_number = 110 - rule_action = "allow" - from_port = 80 - to_port = 80 - protocol = "tcp" - cidr_block = "10.0.2.0/24" - }, + cidr_block = "0.0.0.0/0" + } ] private_outbound = [ { @@ -24,16 +16,8 @@ locals { from_port = 443 to_port = 443 protocol = "tcp" - cidr_block = "10.0.1.0/24" - }, - { - rule_number = 110 - rule_action = "allow" - from_port = 443 - to_port = 443 - protocol = "tcp" - cidr_block = "10.0.2.0/24" - }, + cidr_block = "0.0.0.0/0" + } ] } @@ -142,32 +126,6 @@ resource "aws_security_group" "dynamodb_sg" { } } -# resource "aws_network_acl" "private_nacl" { -# vpc_id = module.vpc.vpc_id - -# egress { -# protocol = "tcp" -# rule_no = 200 -# action = "allow" -# cidr_block = ["10.0.1.0/24", "10.0.2.0/24"] -# from_port = 443 -# to_port = 443 -# } - -# ingress { -# protocol = "tcp" -# rule_no = 100 -# action = "allow" -# cidr_block = ["10.0.1.0/24", "10.0.2.0/24"] -# from_port = 80 -# to_port = 80 -# } - -# tags = { -# Name = "vpc-g3-bsmsapp" -# } -# } - data "aws_iam_policy_document" "dynamodb_endpoint_policy" { statement { effect = "Deny" @@ -226,3 +184,6 @@ resource "aws_security_group" "vpc_tls" { } } +# output "aws_security_group_dynamodb" { +# value = aws_security_group.dynamodb_sg.id +# } diff --git a/terraform/resources/html/index.html b/terraform/resources/html/index.html deleted file mode 100644 index 73eec9e..0000000 --- a/terraform/resources/html/index.html +++ /dev/null @@ -1,47 +0,0 @@ -<!DOCTYPE html> -<meta charset="UTF-8"> -<html> - <head> - <title>BSMSapp</title> - <div align="center"> - </head> - <br><br> - <body bgcolor="#FFFFFF" text="Black"> - <h1><span id="replace">BSMSapp</span></h1> - - <form id="myForm"> - <input value="0" name="id"/> - <br> - <input value="0" name="stock"/> - <br><br> - <input type="submit" value="Upload"/> - </form> - </body> - </div> - -</html> - -<script> - const thisForm = document.getElementById('myForm'); - thisForm.addEventListener('submit', async function (e) { - e.preventDefault(); - const formData = new FormData(thisForm).entries() - const str = JSON.stringify(Object.fromEntries(formData)) - console.log(str.replace(/\"/g, '')) - // let test = { - // id: 212311111, - // stock: 131211 - // } - const response = await fetch("${ENDPOINT}/resource", { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: str.replace(/\"/g, '') - // body: JSON.stringify(test) - }); - - const result = await response.json(); - console.log(result) - }); -</script> \ No newline at end of file diff --git a/terraform/resources/lambda/lambdaDB.zip b/terraform/resources/lambda/lambdaDB.zip new file mode 100644 index 0000000000000000000000000000000000000000..b897c88ad8e9c90f9abceb457a044c13ec76c27d GIT binary patch literal 481 zcmWIWW@Zs#U|`^2sGb-d8vDh&Rg;l{;W`itGRQFGB<3ciB*teX=B4DM7U>mKhK6u5 zFiU-jN(SN53T_5QmKV$n3}C`Hz}uf$QNZr-dWD#>>{H8bMNgKy_APIbnp{?LgoJim zt7ybl!@uwO*7VPt@iWf2=Ow$mP<8LUK;x@({p&n6uYNdFl_|6Op=``7<EODr=S`vm zjZQ578noF|`;O&@;I}_?HRMa4{Jxvy@A>@e$2n(h{~!N+nMGnvNI-c1x>=i7&H8(> za=)5%@?1fcdu|;2k7@d*2)YF=T61tIS7-de8!wJeDE@l!<h|E?mziaH%KdK~p4A`N z(Bm0X<m0z#bHg*ur902(p1s|^JGU@@{n5mkrBgCys&I8L?DX1I)poh?PQwdv)t2Kb zmnF>OnBzCDKAJS|p!ftSCl{4$j{K=j5=Yt2OYad~yY-**9hPDPKGQ!<>DO0AoW2@% z+49Q`{*C9X9~dn+vgkdy(dNH&fHxzP95b#^mjK2F0|PJu7?w1GSXknK6%q$%;UD15 R$_CQF2!!E4x&&kf0|56_ygmQ` literal 0 HcmV?d00001 diff --git a/terraform/resources/lambda/lambdaDB/lambda_handler.py b/terraform/resources/lambda/lambdaDB/lambda_handler.py new file mode 100644 index 0000000..5e83579 --- /dev/null +++ b/terraform/resources/lambda/lambdaDB/lambda_handler.py @@ -0,0 +1,26 @@ +import json +import boto3 +from decimal import * + +class DecimalEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return str(obj) + return json.JSONEncoder.default(self, obj) + + +def main (event, context): + client = boto3.resource('dynamodb', region_name="us-east-1") + table = client.Table("AWSDynamoDB-g3") + + data = table.scan()["Items"] + + resp = { + "statusCode": 200, + "headers": { + "Access-Control-Allow-Origin": "*", + }, + "body": json.dumps(data, cls=DecimalEncoder) + } + + return resp \ No newline at end of file diff --git a/terraform/resources/lambda/lambda.zip b/terraform/resources/lambda/lambdaSQS.zip similarity index 100% rename from terraform/resources/lambda/lambda.zip rename to terraform/resources/lambda/lambdaSQS.zip diff --git a/terraform/resources/lambda/lambda_handler.py b/terraform/resources/lambda/lambdaSQS/lambda_handler.py similarity index 100% rename from terraform/resources/lambda/lambda_handler.py rename to terraform/resources/lambda/lambdaSQS/lambda_handler.py