https://qiita.com/takmot/items/eda7c2f519581b40ec3f
前回記事の続きとして、フリートプロビジョニング前にフックするLambdaの作成例を記載します。
プロビジョニング許可/拒否判定方法
- シリアルナンバーと、プロビジョニング許可/拒否を表す値を記載したCSVファイルをS3に格納
- LambdaからこのCSVファイルを参照し、デバイスから通知されたシリアルナンバーからプロビジョニング許可/拒否判定
以下CSVファイル例
SerialNumber,Effect
1,Allow
2,Deny
3,Allow
Lambda関数
変更前コード
import json
provision_response = {'allowProvisioning': False}
def isBlacklisted(serial_number):
#check serial against database of blacklisted serials
...
def lambda_handler(event, context):
# DISPLAY ALL ATTRIBUTES SENT FROM DEVICE
print("Received event: " + json.dumps(event, indent=2))
# Assume Device has sent a device_serial attribute
device_serial = event["parameters"]["SerialNumber"]
# Check serial against an isBlacklisted() function
if not isBlacklisted(device_serial):
provision_response["allowProvisioning"] = True
return provision_response
isBlacklistedで、
引数としてシリアルナンバーを受け取り、
プロビジョニング許可であればFalse、
プロビジョニング拒否であればTrueを返すように変更します。
変更後コード
参考記事:
https://qiita.com/asunaro/items/99472b492af387d97b70
https://note.nkmk.me/python-pandas-at-iat-loc-iloc/
import json
import boto3
import pandas as pd
from io import StringIO
def isBlacklisted(serial_number):
BUCKET_NAME:<バケット名>
KEY_NAME:<CSVファイルパス(xxx/yyy.csv)>
# S3に格納したCSVファイルからDataFrameを作成
s3 = boto3.resource('s3')
s3obj = s3.Object(BUCKET_NAME, KEY_NAME).get()
csv_string = s3obj['Body'].read().decode('utf-8')
df = pd.read_csv(StringIO(csv_string), index_col=0)
try:
# 許可/拒否判定
effect = df.at[serial_number, 'Effect']
if effect == 'Allow':
return False
else:
return True
except:
# 該当serial_numberなし
return True
def lambda_handler(event, context):
# 変更なし
外部ライブラリの使用
Lambdaから外部ライブラリ(今回の場合Pandas)を使用する場合、
ライブラリをzipにまとめてアップロードする方法と、
Layerを設定する方法があります。
Layerの作成方法に関しては触れません。
以下記事(2. pandasのLayerのARNを調べ、Layerを追加)を参考にLayerを追加
https://qiita.com/polarbear08/items/202752d5ffcb65595bd9
実行ロールのポリシー設定
アクセス制限→ ロール名のリンクをクリック
「ポリシーをアタッチします」をクリック
AWS管理ポリシーからs3で検索し、
今回S3に格納したファイルのリードが必要なので、
「AmazonS3ReadOnlyAccess」をチェックし、
「ポリシーのアタッチ」をクリック
Lambda関数のアップロード
※ローカルでLambda関数を作成してアップロードする場合
ファイル名はlambda_function.py
にします。
lambda_function.pyをzip圧縮します
アクションから.zipファイルをアップロードを選択し、アップロードします