Lambda
- AWS의 Serverless compute service
- 서버 인프라를 프로비저닝하거나 관리할 필요없이 Lambda 기능을 선호 언어로 작성하고 AWS 서비스에 업로드하여 코드를 자동으로 트리거하도록 설정하거나 웹/모바일 앱에서 직접 코드를 호출
- Serverless 모델은 개발자가 서버 인프라를 관리할 필요없이 Dev에만 집중할 수 있다.
- 예: JavaScript로 funtion을 작성하고 AWS Lambda로 Push하면, 백엔드 없이, 그 이벤트가 있을 때마다 function 실행이 될 수 있는 기능 제공
- 여기서 람다함수 역할
- API Gateway로부터 람다함수 호출해서 IoT Core(AWS server)의 Device Gateway로의 MQTT 클라이언트 역할
- Rule engine은 Topic이 도착하면 SQL로 정제하고 람다함수 호출 -> 람다함수는 DynamoDB에 Put하는 역할
Create Lambda function
1. 람다 함수 생성(Console)

- AWS Lambda 콘솔에서 함수를 생성한다.
2. 람다 함수 설정

- 특히 언어 선택!
- Configure 후 함수 생성
3. 생성된 Lambda 함수에 권한 부여
4. 정책 연결 클릭
- IAM 역할 Console로 이동 됨 > "정책 연결" 클릭

5. IoT Core에 접근 할 수 있는 권한을 가진 Lambda 함수와 연결

- IoT Core에 접근 할 수 있는 권한을 가진 Lambda 함수와 연결한다.
- AWSIoT1ClickFullAccess 정책을 선택 > "정책 연결"
- 아래는 AWSIoT1ClickFullAccess 정책의 json 내용
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iot1click:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
6. Role에 Policy가 attach! 되었음

- 생성한 람다 함수가 가진 Role에 IoT에 Full access가 가능한 정책이 붙은 모습

7. Lambda 함수 코드 수정
connect-tutorial
import json
import boto3
client = boto3.client('iot-data')
def lambda_handler(event, context):
temp = 20
response = client.publish(
topic = 'connect/test',
qos = 0,
payload = json.dumps({"hello": "world", "value": temp})
)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
- AWS SDK를 사용하여 IoT Core와 연결
- Python의 경우 boto3 모듈 사용
client = boto3.client('iot-data')
를 통해 클라이언트를 생성
- 인자를 통해 사용할 서비스를 결정할 수 있다.(AWS SDK 설명 참조)
response = client.publish(topic='',qos= ,payload=)
는 해당 클라이언트를 통해 AWS IoT Core로 메시지 발행. topic과 payload를 설정할 수 있다.
Lambda function in Greengrass
- AWS IoT Core Greengrass Core에서 Lambda function의 import가 가능하다. (IoT Core는 AWS 서버고, Greengrass Core는 로컬 디바이스임!)
- Core Device에서 돌리고 싶은 Lambda function이 있는 경우
- AWS IoT Greengrass V2 Core 위에서 AWS IoT Greengrass V1 App이 있는 경우
- 다음의 Component가 Lambda함수 dependency를 포함한다.
이 Component들을 정의 x, Lambda함수를 배치할 때 이 Lambda Component Dependency를 포함해야한다.
- Lambda launcher component(aws.greengrass.LambdaLauncher)는 Env configur, processes 다룸
- Lambda manager component(aws.greengrass.LambdaManager)는 IPC, Inter Process Scaling
- Lambda runtimes component(aws.greengrass.LambdaRuntimes)는 지원되는 Lambda runtime 각각에 대한 artifact 들 제공
- Lambda function import 하는 두 가지 방법
Lambda import using Console
- Greengrass Console을 사용하여 Lambda component를 생성, 기존 Lambda 함수 import 및 configure
1. import할 Lambda 함수 선택
- Greengrass Console에서 Component 페이지
- create component 선택
- Component information에서, import Lambda function 선택

- Greengrass는 Lambda 함수의 이름으로 Component를 생성한다.
- Import할 Lambda 함수 버전을 선택하라.
$LATEST
는 선택할 수 없다.
3
버전을 선택하면, Component version은 3.0.0
이 된다.
- 어느 Lambda 함수가 work message에 대해 subscribe 할 것인지 event sources list에 추가한다.
- 람다 함수는 event source로 부터 메시지를 받을 때, 호출된다.
- 이 함수를 local publish/subscribe 메시지, AWS IoT Core MQTT message에 대해 subscribe 할 수 있다.
- 아래의 Event sources를 보고, 추가하라.
- 네가 추가하는 각 이벤트 소스에 대해 다음의 옵션을 지정해라.
- MQTT topic: 메세지를 subscribe할 토픽 이름
- Type: event source의 type
- 다른 event source를 추가하기 위해선, Add event source를 하고 위 단계를 반복하라.
- event source를 제거하기 위해선, remove 하기 원하는 event source 옆 Remove를 선택하라.
- Timeout (seconds) 에 대해, 초 단위의 최대치를 입력하라. (default: 3sec)
- Pinned 하기 위해선, 람다 함수 컴포넌트가 고정되었는지 선택한다. (default: True)
- pinned(or long-lived) Lambda funtion은 AWS IoT Greengrass가 시작할 때와 자신의 컨테이너에서 계속 실행 중일 때 시작한다.
- Non-pinned(or on-demand) Lambda function은 work item을 받을 때만 실행되고, 지정된 Maximum idle time 동안 계속 idle인 상태로 남아 있다가 종료된다.
- Additional parameters에서, 다음의 Lambda function parameters를 set하라
- Status timeout (sec): Lambda 함수 component가 Lambda manager component에게 status 업데이트 전송하는 사이 interval (sec)
- Maximum queue size: Lambda 함수 component에 대한 메시지 큐의 최대 사이즈. Greengrass Core S/W는 Lambda 함수를 실행하여 각 메시지를 사용할 수 있을 때까지 FIFO로 저장한다.(default: 1000 개)
- 인스턴스의 최대 수: non-pinned Lambda function이 같은 시간에 실행할 수 있는 인스턴스의 최대 수. (default: 100 instances)
- 최대 idle time(sec): non-pinned Lambda function이 Greengrass S/W가 프로세스를 멈추기 전 까지 idle할 수 있는 최대 시간(sec) (default: 60 sec)
- 인코딩 타입: Lambda function이 지원하는 페이로드의 타입. json, binary 중 선택(default: json)
- Lambda 함수가 실행할 때, Pass할 Arguments command line의 리스트 지정
- Additional parameters, Process Arguments에서 Add argument를 선택한다.
- 추가한 각 argument에 대해, Function에 패스하고싶은 argument를 입력하라.
- argument를 제거하고 싶다면 제거하고 싶은 argument 옆 Remove를 선택하라.
- Lambda 함수가 실행할 때 적용되는 환경변수 지정하라. 환경 변수는 configuration setting을 function code 변경 없이 store/ update 가능하게한다.
- Additional parameters, Environment variables에서 environment variable을 선택한다.
- 추가한 각 환경 변수에 대해 옵션을 지정하라
- Key: variable name
- Value: 이 variable에 대한 기본 값
- 환경 변수를 제거하고 싶으면 제거하고픈 환경 변수 옆 Remove를 선택한다.
3. Lambda function에 대해 지정되는 플랫폼 명시
- 모든 Core device는 OS, Arch에 대해 attribute를 가진다.
- Lambda 함수 Component를 배포할 때, AWS IoT Greengrass Core S/W는 사용자가 지정한 플랫폼 Attribute를 Core Device의 플랫폼 Attribute와 비교하여 Lambda 함수가 해당 장치에서 지원되는지 여부를 확인한다.
- 각 플랫폼에 대해 다음의 옵션을 지정한다.
- 다른 플랫폼을 더하고 싶다면, Add platform을 선택하고 위의 스텝을 다시한다.
지원되는 플랫폼을 제거하고 싶다면, Remove 버튼 클릭
4. Lambda 함수에 대한 Component dependency 지정
- Component dependency는 추가적인 AWS-provided components나 cumstom component를 식별한다.
- Lambda function component를 배포할 때, deployment는 당신의 함수를 실행하기 위한 디펜던시를 포함한다.
Important
- Greengrass V1 Lambda function을 import하고 싶다면, 해당 기능이 사용하는 개개별의 컴포넌트 디펜던시를 정의해야한다.
Lambda function configuration, Additional parameters, Component dependencies에서 다음의 step을 통해 Lambda function에 대한 Component 디펜던시를 명시해라.
1. Add dependency 선택
2. 네가 add하는 각 component dependency에 대해, 다음의 옵션을 명시하라.
- Component name: 컴포넌트 이름.
- Version requirement: 이 컴포넌트 디펜던시의 호환 가능한 버전을 식별하는 Semantic Version Constraint.
- Single Version이나 Version의 범위를 지정할 수 있다.
- 예를 들어,
^1.0.0
은 이 람다 함수는 Stream manager component의 first major version의 Any version에 대해 종속됨을 지정한다.
- For more information about semantic version constraint. see npm semver calculator here.
- Type: 디펜던시의 타입. 다음의 옵션을 선택해라.
- Hard: Lambda function component가 디펜던시 상태가 변경되면 재시작한다.(default)
- Soft: Lambda function component가 디펜던시 상태가 변경되어도 재시작하지 않는다.
- Component dependency를 제거하고 싶다면, 컴포넌트 디펜던시 옆 Remove 선택
5. 컨테이너에서 Lambda 함수 실행
- 기본적으로 람다 함수는 isolated runtime 환경에서 Greengrass 내부에서 실행한다.
- isolation X, 프로세스로써 Lambda function을 돌릴 수 있다.(No caontainer mode)
- Linux process configurtaion에서, 다음의 옵션을 선택할 수 있다.
- Greengrass Container: Lambda function은 컨테이너에서 실행된다.(default)
- No container: Lambda function은 isolation 없이 프로세스로 실행된다.
- 컨테이너에서 Lambda function을 돌리면, 다음의 step으로 람다함수에 대한 process configuration을 완성하라.
-
메모리와 시스템 리소스의 양 Configure.
-
예: Volumes, devices가 컨테이너에서 사용가능하게 만듬
-
Container parameter에서, 다음을 해라
- Memory size에 대해, 컨테이너에 할당하고 싶은 메모리 사이즈 지정(MB or kB)
- Read-only sys folder에 대해, 컨테이너가
/sys
폴더로 부터 정보를 읽을 수 있는지?(default: False)
-
Containerized된 function이 액세스할 수 있는 로컬 볼륨 Configure
- Volume을 정의할 때, Greengrass Core S/W는 소스 파일을 컨테이너 내부의 destination에 마운트한다.
- Volumes에서 Add volume을 선택하라
- 네가 추가한 각 볼륨에 대해, 다음의 옵션을 명시하라.
- Physical volume: 코어 디바이스에서 소스 폴더로의 Path
- Logical volume: 컨테이너 내부의 destination folder path
- Permission: 컨테이너가 소스 폴더에 액세스 할 수 있는지의 Permission
- Read-only: Lambda function은 소스 폴더에 read-only access할 수 있다.(default)
- Read-write: Lambda function은 소스 폴더에 R/W할 수 있다.
- Add group owner: 소스 폴더의 소유자(owner)로서 Lambda function component를 실행하는 system group을 추가할지 안할지?(default False)
- Volume을 제거하고 싶으면 제거하고 싶은 Volume 옆에 Remove를 선택한다.
-
containerized Lambda function이 액세스 할 수 있는 local system device configure!
- ㅇ
- Devices에서, Add device
- 추가하는 각 디바이스에서, 다음의 옵션을 명시하라.
- Mount path: 코어 디바이스에서 시스템 디바이스로의 Path
- Permission: 컨테이너가 시스템 디바이스를 액세스 하는데 대한 Permission.
- Read-only: Lambda function은 시스템 디바이스에 Read-only Access를 할 수 있다.(default)
- Read-write: Lambda function은 소스 폴더에 R/W Access
- Add group owner: 소스 폴더 소유자(owner)로서 Lambda function component를 실행하는 system group을 추가할지 안할지?(default False)
6. Lambda function component 생성
-
Lambda function component를 위한 셋팅 이후에, finish creating the new component!
-
코어 디바이스에서 Lambda function을 돌리기 위해, 코어 디바이스에 새로운 Component를 배포할 수 있다.