본문 바로가기

AWS

[중간점검..seminarrr...,,] AWS Greengrass

728x90

디바이스 섀도우(device shadow)

AWS 왈 'AWS IoT Core에서는 언제든 확인하거나 설정할 수 있도록 연결된 디바이스의 최신 상태를 저장하므로, 애플리케이션에는 디바이스가 언제나 온라인인 것처럼 표시된다. 즉, 디바이스가 연결되어 있지 않아도 애플리케이션에서 디바이스의 상태를 확인할 수 있고, 사용자가 상태를 설정하여 디바이스가 다시 연결될 때 설정한 상태가 구현되도록 할 수있다.'

 

- AWS IoT에 디바이스 레지스트리와 디바이스 섀도우가 포함되어 있으므로, 클라우드에 표현하고자 하는 임의의 사물을 이름, 일부 속성 및 영구 가상 '섀도우'를 사용하여 등록할 수 있다.

- 현재 상태 정보를 저장하고 검색하는 데 사용되는 JSON 문서

- 사물이나 장치가 인터넷에 연결되어 있는지 여부에 관계없이 해당 상태를 가져오고 설정할 수 있도록 각 사물 또는 장치에 대해 shadow를 만들고 유지할 수 있다

- SDK를 사용하면 하나의 MQTT 연결에서 단일 또는 여러 개의 shadow 인스턴스의 shadow 문서에 대한 작업을 수행할 수 있다.

- 또한, SDK를 사용하면 shadow 작업과 shadow가 아닌 단순 MQTT 작업에 대해 동일한 연결을 사용할 수 있다

 

1. 전등이 꺼짐

2. 제어장치에서 게시한 명령을 디바이스 섀도우에 전달

3. 전등이 다시 켜질 때, 섀도우와 동기화


AWS greengrass 개발자 가이드1

https://docs.aws.amazon.com/greengrass/v1/developerguide/configs-core.html

 

Deploy cloud configurations to a Greengrass core device - AWS IoT Greengrass

The deployment status is also displayed below the group's name on the page header.

docs.aws.amazon.com

 

그저 람다함수를 생성하고 AWS Greengrass Group에 올리는 과정인데

또 안된다..,, 살려줘요 진짜 이러면 람다함수가 어떻게 움직이는지 내가 ㅂ모르잖아...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

 


AWS Lambda

람다 함수가 S3, DynamoDB, AWS IoT, Greengrass와 같은 AWS 서비스를 직접 호출할 수 있도록 한다. 그린그래스 람다 함수는 코어가 오프라인일 때 클라우드 서비스와 통신할 수 없다.

 

람다 함수는 MQTT 메시지를 사용해 구독(subcription)으로 제어되는 publish-subcription 패턴을 사용하여 MQTT 메시지를 주고 받을 수 있다.

- 그룹 내의 디바이스

- 그룹 내의 커넥터(로컬 인프라, 디바이스 프로토콜, AWS 및 기타 클라우드 서비스와 상호작용 할 수 있도록 하는 사전 구축 된 모듈)

- 그룹 내의 다른 람다 함수

- AWS IoT

- 로컬 shadow 디바이스

 

 

자습서에 나온 예제

#
# Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#

# greengrassHelloWorld.py
# Demonstrates a simple publish to a topic using Greengrass core sdk
# This lambda function will retrieve underlying platform information and send
# a hello world message along with the platform information to the topic
# 'hello/world'. The function will sleep for five seconds, then repeat.
# Since the function is long-lived it will run forever when deployed to a
# Greengrass core.  The handler will NOT be invoked in our example since
# the we are executing an infinite loop.
# 그린그라스 코어 sdk를 사용해 topic에 간단한 publish를 보여준다
# 이 람다 함수는 기본 플랫폼 정보를 검색하고 hello world 메시지와 함께 topic에 대한 플랫폼 정보를 전송한다
# 이 함수는 5초 동안 슬립하고 반복한다
# 이 함수는 long-lived(긴 수명) 함수여서 그린그래스 코어에 배포될 때 영원히 실행된다.
# 핸들러는 이 예제에서 호출되지 않고 무한루프를 실행하고 있다.

import logging #현재 우리의 프로그램이 어떤 상태를 가지고 있는지 외부출력을 하게 만들어서 눈으로 확인하게 함
import platform #현재 사용하는 시스템 환경에 대한 부분 확인
import sys #파이썬 인터프리터 제어
from threading import Timer

import greengrasssdk #AWS IoT Greengrass Core SDK를 사용하기 위해 가져옴

# Setup logging to stdout 로깅 설정
logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

# Creating a greengrass core sdk client 그린그라스 코어 SDK 클라이언트 생성
client = greengrasssdk.client("iot-data")

# Retrieving platform information to send from Greengrass Core 그린그라스 코어에서 전송할 플랫폼 정보 검색
my_platform = platform.platform()


# When deployed to a Greengrass core, this code will be executed immediately
# as a long-lived lambda function.  The code will enter the infinite while
# loop below.
# If you execute a 'test' on the Lambda Console, this test will fail by
# hitting the execution timeout of three seconds.  This is expected as
# this function never returns a result.
# 그린그라스 코어에 배포되면 이 코드가 수명이 긴 람다함수로 즉시 실행될 것
# 이 코드는 아래의 루포 동안 무한대로 들어갈 것
# 람다 콘솔에서 'test'를 실행하면 이 테스트는 3초의 실행 제한 시간에 도달함으로써 실패할 것이다
# 이 함수는 결과를 반환하지 않음이 예상된다

def greengrass_hello_world_run():
    try:
        if not my_platform: #my_platform이 아닌경우
            client.publish(
                topic="hello/world", queueFullPolicy="AllOrException", payload="Hello world! Sent from Greengrass Core."
            )
            #queueFullPolicy : 그린그라스의 대기열이 가득 찼을 때 취할 정책 옵션
            # -AllorException : GGC는 등록된 모든 대상에 메시지를 전달하거나 아무에게도 전달하지 않고 예외를 반환
        else:
            client.publish(
                topic="hello/world",
                queueFullPolicy="AllOrException",
                payload="Hello world! Sent from " "Greengrass Core running on platform: {}".format(my_platform),
            )
    except Exception as e:
        logger.error("Failed to publish message: " + repr(e))

    # Asynchronously schedule this function to be run again in 5 seconds 함수가 5초 후에 다시 실행되도록 비동기식으로 예약한다
    Timer(5, greengrass_hello_world_run).start()


# Start executing the function above 위의 함수 실행 시작
greengrass_hello_world_run()


# This is a dummy handler and will not be invoked 이것은 더미 핸들러이며 호출되지 않는다
# Instead the code above will be executed in an infinite loop for our example 대신 위의 코드가 이 예제에서 무한루프로 실행된다
def function_handler(event, context):
    return

 

 

https://base-on.tistory.com/73

 

(AWS) Lambda, RDS 연결

AWS-Lambda-함수생성 새로 작성-이름 변경 ,룰선택-함수생성 RDS-데이터베이스 생성 MySQL-다음 단계 구성 설정 RDB 정보 입력 확인(메모장에 적어 놓아도 좋다) window-CMD(관리자 권한)- pip install pymy..

base-on.tistory.com

 

위 블로그에 나온 RDS 연결하는 람다함수 예시

import sys
import logging
import pymysql

def lambda_handler(event, context): #함수 핸들러
    #RDS에 연결하는 과정
    conn = pymysql.connect(host="[RDS 엔드포인트]", user="dbuser", password="qwer1234", db="web")
    #커서 객체 생성
    curs = conn.cursor()
    #name이 jhc인 곳에 test로부터 모든 칼럼의 데이터를 출력
    sql = "select * from test where name='jhc'"
    #sql 실행문
    curs.execute(sql)
    #fetchall() : 레코드를 배열 형식으로 저장해줌
    rows = curs.fetchall()

    result = 0
    #for문으로 데이터들을 하나씩 출력
    for row in rows:
        result = row[1]
    #연결종료
    conn.close()

    return result

이런 식으로 하면 될듯...?

 

 

 

728x90

'AWS' 카테고리의 다른 글

[SageMaker] 모델 배포  (1) 2022.06.28
[SageMaker] 모델 훈련  (1) 2022.06.28
[SageMaker] 데이터 세트 다운로드하기  (0) 2022.06.28
[SageMaker] 세이지메이커 시작하기  (0) 2022.06.28
[Greengrass] 엣지 컴퓨팅  (0) 2022.04.12