Switch to side-by-side view

--- a
+++ b/cloudCode/Inference/lambda_function.py
@@ -0,0 +1,92 @@
+import os
+import json
+import boto3
+import urllib
+import logging
+
+s3_client = boto3.client('s3',
+                   aws_access_key_id='aws_access_key_id',
+                   aws_secret_access_key='aws_secret_access_key'
+                 )
+iot_client = boto3.client('iot-data', aws_access_key_id='aws_access_key_id',
+                   aws_secret_access_key='aws_secret_access_key',
+                  region_name='us-west-2', endpoint_url='ats.iot.us-west-2.amazonaws.com')
+
+def lambda_handler(event, context):
+    # Step 1: when new file is upload in s3, lambda function is triggered
+    bucket = event['Records'][0]['s3']['bucket']['name']
+    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
+
+    # Step 2: Read the contents of uploaded sensor data file
+    content = s3_client.get_object(Bucket=bucket, Key=key)
+    text = content["Body"].read().decode()
+    text = json.loads(text)
+    print(text,type(text))
+
+    emotion = { 0: "Angry",
+                1: "Happy",
+                2: "Sad"}
+
+    sagemaker_client = boto3.client('sagemaker-runtime')
+    gsr = text['GSR']
+    bpm = text['BPM']
+
+    sensor_list = [gsr,bpm]
+    reportedValues = []
+    for i in sensor_list:
+        reportedValues.append(str(i))
+    input_data = ','.join(reportedValues)
+
+    # Step 3: Invoke sagemaker endpoint
+    endpoint_name = os.environ['SAGEMAKER_ENDPOINT']
+    content_type = "text/csv"
+    accept = "application/json"
+    payload = input_data
+    response = sagemaker_client.invoke_endpoint(
+        EndpointName=endpoint_name,
+        ContentType=content_type,
+        Accept=accept,
+        Body=payload
+        )
+
+    # Step 4: Retreive the categorical value from numerical output
+    body = response['Body'].read()
+    print('received this response from inference endpoint: {}'.format(body))
+    result = json.loads(body)['predictions'][0]
+    result = result['predicted_label']
+    final_result = str(emotion.get(result))
+    print(final_result)
+
+    # Step 5: Use the result and retreive appropriate recommendation message from another json file
+    content = s3_client.get_object(Bucket="iotproj-inference", Key="output.json")
+    text = content["Body"].read().decode('utf-8')
+    json_content = json.loads(text)
+
+    if final_result == "Happy":
+        message = json_content['Happy']
+    elif final_result == "Sad":
+        message = json_content['Sad']
+    else:
+        message = json_content['Angry']
+
+    # Step 6: Publish new message to AWS IoT Core
+    topic = 'iotsensors/infer/result'
+    iot.publish(
+            topic=topic,
+            qos=1,
+            payload=json.dumps(message, ensure_ascii=False)
+        )
+        
+   # Step 7: Publish message to SNS topic
+    arn = "arn:aws:sns:us-west-2:account-id:sns-topic-name"
+    sns_client = boto3.client('sns')
+    response = sns_client.publish(
+        TargetArn=arn,
+        Message=str(message),
+        MessageStructure='string',
+    )
+
+    print("success!")
+    return {
+            'result': final_result
+        }