람바다를 이용해서 트위터 정기 투고봇 만들어주세요.

9356 단어 AWS

1. 기본 구성

  • 트위터 데이터는 아마존 S3에 저장
  • IAM을 통해 Lambda→S3에 대한 접근 권한 설정
  • Cloud Watch Events에서 1시간 간격으로 Lambda Function
  • 에 불을 붙인다
  • Lambda를 사용하여 S3의 텍스트를 검색하여 Twitter REST API와 컨텐트 결합

  • 2.S3에 저장된 데이터 형식


    트위터의 시간과 내용을 csv 형식으로 기재합니다.
    즉석이라 텍스트 파일을 사용했지만 여기서도 NosQL을 사용할 수 있는데...
    Example)
    [트위터 타임], [트위터 내용]

    3. IAM Role의 설정


    다음과 같이 S3 액세스를 허용하는 IAM 정책을 수립하고 IAM Role에 첨부합니다.
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "s3:*",
                "Resource": "*"
            }
        ]
    }
    

    4. 람바다 펀션의 제작


    Lambda Function 생성, 트리거(시간당 텍스트 파일 검색)
    Cloud Watch를 사용합니다.

    Lambda 함수를 만드는 프로그램은 다음과 같습니다.
    구조적으로'텍스트 파일에 기재된 시간'과'현재 시간'이 일치하면
    트위터 REST API에 트위터 정보를 공동으로 게시합니다.
    
    import json
    import boto3
    import re
    import datetime
    from requests_oauthlib import OAuth1Session
    S3 = boto3.client('s3')
    
    def lambda_handler(event, context):
        # TODO implement
        #バケットファイルからテキスト一覧を取得
        BUCKET = S3.list_objects_v2(Bucket="daily-tweets",Prefix="DAILY_TWEETS")
        for content in BUCKET['Contents']:
        #~~.txtファイルを検索
            if re.match(r'^[^\.]+\.txt',content['Key']):
                obj=S3.get_object(Bucket="daily-tweets",Key=content['Key'])
                l=obj['Body'].read().decode('utf-8').split(",")
                time=datetime.datetime.utcnow() + datetime.timedelta(hours=9)
                print (time.strftime("%H") )
                #時間データと照合して合致したらツイート
                if time.strftime("%H") == l[0]:
                    print (l[1])
                    CK = '****' # * enter your Consumer Key *
                    CS = '****' # * enter your Consumer Secret *
                    AT = '****' # * enter your Access Token *
                    AS = '****' # * enter your Accesss Token Secert *
                    UPDATE_URL = 'https://api.twitter.com/1.1/statuses/update.json'
                    twitter = OAuth1Session(CK, CS, AT, AS)
                    req = twitter.post(UPDATE_URL,params={"status":l[1]})
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Lambda!')
        }
    
    
    단지 이렇게 한 번만 시작하는 프로그램이기 때문에 정기적으로 실행하기 위해 클라우드 워치 이벤트에cron을 설정합니다.
    설정값은 다음과 같습니다. 1시간마다 한 번씩 밀어줍니다.(cron으로 바꾸면 10분마다 가능하고 이번 주 수요일에만 가능합니다.)
    cron(0 * * * ? *)
    주)
    from requests_oauthlib import OAuth1 Session→이쪽은 AWS 표준을 사용할 수 없기 때문에 layer를 만들어야 합니다.상세한 상황은
    아래의 문장은 참고할 수 있다.
    https://www.yamamanx.com/aws-lambdapython-twitter-post/

    5. 볼품없는 곳

  • API 키를 직접 쓰지 마세요!
    → 시크릿 관리자 같은 건 어떻게든 해결할 수 있을지도 몰라...
  • 필요 없어요. S3인가요?→ 단순도를 중시하고 S3를 사용했으니 NoSQL 같은 것을 사용했겠지...?
  • API Gateway를 이용해 트위터 등록을 하는 것이 좋을지도 몰라요...(WEB에 노출된 서비스라면 안전에 대한 걱정이 좀 있어서...)
  • 6. 끝말


    제작된 트위터를 잽싸게 해설했다.그래서 "여기 구성이 더 좋아요!"기다리다
    있으면 많이 나무라세요.

    좋은 웹페이지 즐겨찾기