0
2

More than 5 years have passed since last update.

AWS Lambda と AWS SNS を利用して、AWS SageMaker で起動中のエンドポイントを携帯に通知する。

Last updated at Posted at 2019-08-15

はじめに

今回はAWS SageMaker で作成したエンドポイントの消し忘れ防止用に、エンドポイントが起動している場合、決まった時間に携帯へ通知するシステムを作成しました。
その内容を説明します。

構成図は以下の通りです。

image.png

Lambda 関数の作成

  • まず、AWS のコンソール上で lambda と検索しLambda を開きます。
    image.png

  • 左のサイドバーから関数を選択し、右上の関数の選択をクリックします。
    image.png

  • 各項目を設定し、関数の作成 をクリックします。
    image.png

  • Laambda 関数が作成されたのを確認し、左のトリガーの追加をクリックします。
    image.png

  • トリガーの選択から CloudWatch Events を選択します。
    image.png

  • ルールから新規ルールの新規作成を選択します。
    image.png

  • 各項目を設定します。
    スケジュールの入力方式については以下のドキュメントを参考にしてください。
    https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
    image.png

  • 設定をし終えたら下にスクロールし、トリガーの有効化からチェックを外して追加をクリックします。
    image.png

  • トリガーが作成されたら、画面真ん中のLambda 関数をクリックし、下にスクロールします。
    image.png

  • 関数コードの欄までスクロールしたら赤枠内に、以下のコードを貼り付けてください。
    ※phoneNumberにメッセージを送る携帯の電話番号を入力しておいてください。
    image.png

import json
import boto3

def lambda_handler(event, context):
    #SageMakerが利用できるリージョンを取得
    regions = boto3.Session().get_available_regions('sagemaker')

    inservice_endpoints = {}
    for region in regions:
    #SageMakerが利用できるリージョンごとに以下を実行
        #指定したリージョンのSageMakerを利用するためのおまじない
        sm = boto3.client('sagemaker', region_name=region)

        #実行中のエンドポイントを取得
        endpoints = sm.list_endpoints(
            StatusEquals = 'InService'
        )
        if len(endpoints['Endpoints']) > 0:
            inservice_endpoints[region]=endpoints

    #実行中のエンドポイントがあった場合、指定の電話番号にメッセージを送信
    if len(inservice_endpoints) > 0 :

        #Amazon SNS を利用するためのおまじない
        sns = boto3.client("sns")

        phoneNumber = "+81電話番号"
        message = "Endpoint exists"

        #指定した電話番号にメッセージを送信
        sns.publish(
          PhoneNumber = phoneNumber,
          Message = message
        )

    return {
        'statusCode': 200,
        'body': json.dumps('done')
    }

  • コードをペーストしたら、右上の保存をクリックし、下にスクロールします。
    image.png

  • 基本設定の欄までスクロールしたら、タイムアウトの時間を15秒に変更します。
    image.png

  • 次に、赤枠で示した青文字をクリックします。
    image.png

  • IAMロールのタブが開いたら、ポリシーをアタッチしますをクリック。
    014.jpg

  • AmazonSageMakerReadOnly と検索し、チェックマークを付けてポリシーのアタッチをクリックします。
    image.png

  • ポリシーがアタッチされたことを確認し、もう一度ポリシーをアタッチしますをクリックします。
    016.jpg

  • AmazonSNSFullAccess と検索し、チェックマークを付けてポリシーのアタッチをクリックします。
    image.png

  • ポリシ-がアタッチされたことを確認し、Lambda 関数のタブに戻ってください。
    ※今回アタッチしたポリシーは権限を絞ることができます。セキュリティ面上 FullAccess などはよくないので、実際に利用する際は適切な IAM ロール設定を行いましょう。
    018.jpg

  • Lambda のタブに戻ってきたら、右上のテストをクリックします。
    image.png

  • 各項目を設定し、下にスクロールします。
    image.png

  • 作成をクリックします。
    image.png

  • 右上のテストをクリックし、一番上までスクロールします。
    image.png

  • 実行が成功したことを確認します。

  • image.png

  • それでは、エンドポイントをデプロイした状態で、もう一度テストを実行してみましょう。
    ※エンドポイントが InService になってからテストを実行してください。
    image.png
    image.png

  • すると、設定した電話番号の携帯にメッセージが届きます。
    image.png

  • 動作を確認したら、CloudWatch Events を選択し、下にスクロールします。
    image.png

  • イベントを有効にして、保存をクリックします。
    これで、設定したスケジュールで Lambda 関数が起動するようになります。
    image.png

最後に

今回はエンドポイントの消し忘れ防止用に、エンドポイントが起動している場合、決まった時間に携帯へ通知するシステムを作成しました。
エンドポイントは稼働時間に対して課金が発生するので、使わなくなったエンドポイントは消しておくようにしましょう。

参考文献

uploading-0

0
2
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
0
2