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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/a7bb292e-49d5-0562-8ad6-eaede5d5467e.png)



# Lambda 関数の作成
- まず、AWS のコンソール上で lambda と検索し**Lambda** を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/43b257c9-e08b-8f76-0b52-9e55e6118e42.png)  

- 左のサイドバーから**関数**を選択し、右上の**関数の選択**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ad8faef0-2cd6-7682-b67d-54242acef3fc.png)

- 各項目を設定し、**関数の作成** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/db103b60-a031-d3c2-5965-b6a31965a2bf.png)

- Laambda 関数が作成されたのを確認し、左の**トリガーの追加**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/c6edd89b-cb8f-66eb-6644-8b627d1dcb02.png)

- トリガーの選択から CloudWatch Events を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/002f3861-9e53-3f84-2991-243a6f262d36.png)

- ルールから新規ルールの新規作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/24b42711-5846-3247-da20-4b2b07fb7a99.png)

- 各項目を設定します。
スケジュールの入力方式については以下のドキュメントを参考にしてください。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e2fb8c33-c6ae-4992-aef8-3f2d1c439aa8.png)

- 設定をし終えたら下にスクロールし、トリガーの有効化からチェックを外して追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/57aa9fd5-6e14-093b-448c-910094431a5f.png)

- トリガーが作成されたら、画面真ん中のLambda 関数をクリックし、下にスクロールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/02f8df80-e0c7-1dac-20c9-55a2a3e00a6f.png)


- 関数コードの欄までスクロールしたら赤枠内に、以下のコードを貼り付けてください。
※phoneNumberにメッセージを送る携帯の電話番号を入力しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/5d42752b-0e52-808a-7acf-d30dae73a119.png)

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/2d6bb568-e565-1563-1624-6273ec08b7fb.png)

- 基本設定の欄までスクロールしたら、タイムアウトの時間を15秒に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/4ed8f9fc-5cec-4f50-de3a-cd20463a7e9d.png)


- 次に、赤枠で示した青文字をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d34d80fc-dd54-b588-4137-e487ef436bdc.png)


- IAMロールのタブが開いたら、ポリシーをアタッチしますをクリック。
<img width="933" alt="014.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e93156c0-64ce-07fb-2026-05690fc8b37c.jpeg">


- AmazonSageMakerReadOnly と検索し、チェックマークを付けてポリシーのアタッチをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f235a497-34fc-088b-cd43-961e9238e304.png)

- ポリシーがアタッチされたことを確認し、もう一度ポリシーをアタッチしますをクリックします。
<img width="959" alt="016.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d5819e14-d959-498a-dbc7-f9c299c0e622.jpeg">


- AmazonSNSFullAccess と検索し、チェックマークを付けてポリシーのアタッチをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/c9788e0b-20b7-cb0f-bfbd-999119c581d6.png)

- ポリシ－がアタッチされたことを確認し、Lambda 関数のタブに戻ってください。
※今回アタッチしたポリシーは権限を絞ることができます。セキュリティ面上 FullAccess などはよくないので、実際に利用する際は適切な IAM ロール設定を行いましょう。
<img width="960" alt="018.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/66afa467-abe0-3917-4512-1d0b96a684c9.jpeg">


- Lambda のタブに戻ってきたら、右上のテストをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/c12ddd3e-dcbf-069a-4ae9-2b26318f8c44.png)

- 各項目を設定し、下にスクロールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f30f7cd1-f2db-49cc-e3aa-4ce8722688b0.png)

- 作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e1be7cfc-ecff-55f6-78cd-ed82c4c54a08.png)

- 右上のテストをクリックし、一番上までスクロールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e56d9873-ace4-3128-8c8d-1948d2f87e0d.png)


- 実行が成功したことを確認します。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/9787c872-dd26-828e-de8b-6d30cb2576f0.png)

- それでは、エンドポイントをデプロイした状態で、もう一度テストを実行してみましょう。
※エンドポイントが InService になってからテストを実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/7fcc9178-a558-0877-11bc-e85369b6ec59.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/16d219f8-2869-005f-ef40-738ce371d397.png)

- すると、設定した電話番号の携帯にメッセージが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d2ec7883-1c69-55da-6678-99242466aebc.png)

- 動作を確認したら、CloudWatch Events を選択し、下にスクロールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/86d2085f-d357-7aa1-501a-63bbcb850c80.png)

- イベントを有効にして、保存をクリックします。
これで、設定したスケジュールで Lambda 関数が起動するようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/9898d1d0-6c99-c76b-b3f3-becf6ba8087c.png)




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

# 参考文献
- Amazon SageMakerの起動しているノートブックインスタンスとエンドポイントをSlackに通知するBotを作ってみた  
https://dev.classmethod.jp/tool/sagemaker-slack-list-notebook-endpoint/



![uploading-0]()