Lambda + CloudWatch + DynamoDB + LINE Notify로 알림 만들기

소개



DynamoDB의 캐치 업 속에, 리마인더를 만들고 싶었기 때문에 만들어 보았다.
이번에는 시간이별로 없었기 때문에 비망록 같은 느낌. (아직 완성되지 않음)

구성으로서는 이하와 같은 느낌.


사실은 안드로이드 앱을 만들어 푸시 알림까지 가지고 가고 싶었지만 시간이 없기 때문에 나중에.
통지의 부분은, 간단하게 할 수 있는 LineNotify를 사용해 Line으로 통지를 하도록(듯이) 했다.

DynamoDB 설정


  • IAM에서 사용자에게 AmazonDynamoDBFullAccess 권한을 부여
  • DynamoDB의 톱 페이지에서 테이블 작성을 누릅니다.
  • 테이블명과 파티션 키명(이번에는 Date)을 입력한다.
  • 가능한 DynamoDB의 구성은 다음과 같다.
  • 테이블… 데이터 콜렉션.
  • 항목 ... 각 테이블에는 0 개 이상의 항목이 있습니다.
  • 속성 ... 각 항목은 하나 이상의 속성으로 구성됩니다.

  • 항목 작성 버튼에서 지정된 테이블의 항목과 데이터를 설정할 수 있습니다.
    이번 구성
  • remainder_id: Number ID
  • color: String 표시 칼라 (6진수)
  • contents: String 내용
  • Date: String 날짜(format: 2019-12-22)
  • time: String 시간(format: 00:00)
  • type: Number 범주


  • DynamoDB 개발자 가이드: htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / 아마 젠 dy 나모 db / ㅁ st / ゔ ぇ ぺ ぺ ぐ い / / t 로즈 c 치오. HTML

    Lambda에서 함수 만들기



    Lambda에는 3개의 함수를 만들 예정.
    - Regist Remainder : 알림 등록
    - Put Remainder: 전날 알림을 CloudWatch에 등록
    - Push Remainder : 알림 알림

    주의점 1: 함수내에서 DynamoDB를 접속할 때는, role의 설정을 잊지 않는다
    참고 → Lambda에서 DynamoDB 볼 때의 권한 : htps : // 이 m / 헤르 LS / ms / d80c9 f0290966 b0cf8
    주의점 2:파티션키와 소트키의 관계를 이해하지 않으면 데이터를 잘 취할 수 없다.
    참고 → DynamoDB에서 Python을 사용해보십시오 : htps : // m / e s taro / ms / b329, fd fu f790 아 355

    RegistRemainder 함수



    ※나중에 만든다

    PutRemainder 함수



    ※이것 아직 잘 되어 있지 않습니다. .
    import json
    import boto3
    import datetime
    from boto3.dynamodb.conditions import Key
    
    
    cloudwatch = boto3.resource('cloudwatch')
    dynamodb = boto3.resource('dynamodb')
    remainder_table = dynamodb.Table('Remainder')
    
    
    def lambda_handler(event, context):
        # get tomorrow schedule from DB
        response= remainder_table.query(
            KeyConditionExpression=Key('Date').eq(str(datetime.date.today()))
        )
        print('Get Tommorow Data: ', response)
    
        if len(response['Items']) > 0:
            for data in response['Items']:
                print('GET Items: ', data)
                # リマインド時間取得
                remaind_date = datetime.datetime.strptime(str(data['Date'])+ " " + str(data['time']), '%Y-%m-%d %H:%M')
                print('Set Date: ', remaind_date.datetime)
                print('Set Remaind Id', data['remaind_id'])
                # Put an event
                response = cloudwatch.put_events(
                    Entries=[
                        {
                            'Time': remaind_date.datetime,
                            'Resources': [
                                ARNYour AmazonResourceName',
                            ],
                            'Detail': {"remaind_id": data['remaind_id']}
                        }
                    ]
                )
                print(response['Entries'])
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Lambda!')
        }
    

    이 Lambda 함수는 매일 0시에 시작하도록 CloudWatch에서 설정.
    시작하면 오늘 Remainder의 시간을 DynamoDB에서 찾아 CloudWatchEvent에 등록한다.

    PushRemainder 함수


    import json
    import boto3
    import datetime
    from boto3.dynamodb.conditions import Key
    import requests
    
    
    dynamodb = boto3.resource('dynamodb')
    
    
    def lambda_handler(event, context):
        print('START lambda_handler: getParam ->', event)
        print('TODAY IS: ', str(datetime.date.today()))
        remainder_table = dynamodb.Table('Remainder')
        table_response= remainder_table.query(
            KeyConditionExpression=Key('Date').eq(str(datetime.date.today())) & Key('remaind_id').eq(event['remaind_id'])
        )
    
        print('>>>>>>Get Data: ', table_response)
    
        if len(table_response['Items']) > 0:
            for remaind_data in table_response['Items']:
                header = {'Authorization':'Bearer <access token>'}
                param = {'message': remaind_data['contents']}
                response = requests.post('https://notify-api.line.me/api/notify', headers=header, data=param,)
                print('>>>>>SEND: ', remaind_data['contents'])
                print('>>>>>>POST Response: ', response)
    
        return {
            'statusCode': 200,
            'body': json.dumps('Remaind Finish!')
        }
    

    CloudWatchEvent에 등록되어 지정된 시간이 되면 인수가 전달되어 실행되는 함수입니다.
    실행되면,
    오늘 날짜와 인수로 전달 된 remaider_id를 기반으로 DynamoDB에서 검색.
    취득한 리마인더 데이터를 LineNotify를 사용해 Line에 통지를 한다.


    공식 문서 : htps : // 후 fy 보 t. 네. 메/도 c/그럼/
    ※LineNotify에 리퀘스트를 송신할 필요가 있으므로, Lambda에 requests 라이브러리등의 외부 모듈을 설정한다
    주의사항: zip을 업로드할 때 lambda_function.py의 데이터가 사라질 수 있으므로 주의! ! ! ! ! !
     →requests 모듈 설치: htps : // 코 m / 샤세 03 / ms / 16fd31d3698f207b42c9

    ※Notify의 액세스 토큰 취득은 PC 사이트에서 밖에 할 수 없기 때문에 주의
     →토큰 발행 방법: htps : // 이 m/이니키키다 7/ 있어 ms/576 아 8226바

    결론



    이런 느낌.
    이미지라든지 표시할 수 있다고 생각하므로, 맛을 추가해 갑니다.


    끝에



    수시로 진행이 있으면 갱신합니다!
    연말까지는 완성시키면 좋겠다고 생각합니다!

    좋은 웹페이지 즐겨찾기