LoginSignup
1
0

More than 3 years have passed since last update.

フリートプロビジョニング前にフックするLambdaの作成例

Posted at

https://qiita.com/takmot/items/eda7c2f519581b40ec3f
前回記事の続きとして、フリートプロビジョニング前にフックするLambdaの作成例を記載します。

プロビジョニング許可/拒否判定方法

  1. シリアルナンバーと、プロビジョニング許可/拒否を表す値を記載したCSVファイルをS3に格納
  2. 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/

lambda_function.py
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

実行ロールのポリシー設定

1.png
アクセス制限→ ロール名のリンクをクリック
2.png
「ポリシーをアタッチします」をクリック
3.png
AWS管理ポリシーからs3で検索し、
今回S3に格納したファイルのリードが必要なので、
「AmazonS3ReadOnlyAccess」をチェックし、
「ポリシーのアタッチ」をクリック

Lambda関数のアップロード

※ローカルでLambda関数を作成してアップロードする場合

ファイル名はlambda_function.pyにします。
lambda_function.pyをzip圧縮します
4.png
アクションから.zipファイルをアップロードを選択し、アップロードします

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0