S3 알림 이벤트로 트리거되는 AWS Lambda 함수 생성

4537 단어 lambdachalices3aws
  • Amazon S3 알림 기능은 버킷에서 특정 이벤트가 발생할 때 알림을 받을 수 있습니다.
  • 알림을 활성화하려면 먼저 Amazon S3가 게시할 이벤트를 식별하는 알림 구성을 추가해야 하며 여기에서 알림을 보낼 대상은 람다 함수입니다
  • .
  • Overview of notifications
  • 이 게시물에서는 AWS 성배를 사용하여 이를 생성하는 방법을 설명합니다.



  • 1. aws chalice new-project cdn-invalidation 생성




    ⚡ $ chalice new-project cdn-invalidation
    ⚡ $ ls cdn-invalidation
    app.py  requirements.txt
    


    2. 로컬 aws 구성에서 기본값 대신 람다 함수를 생성할 영역을 정의합니다.




    ⚡ $ export AWS_DEFAULT_REGION=us-east-1
    


    3. 람다 함수 핸들러 생성


  • 핸들러가 s3:ObjectCreated:Put 이벤트를 수신하므로 s3://mybucket/static/src의 변경 사항이 람다 함수를 트리거합니다.
    app.py


  • from chalice import Chalice
    import boto3
    import time
    
    
    app_name = 'cdn-invalidation'
    app = Chalice(app_name=app_name)
    app.debug = True
    
    
    class InvalidateCDN:
        """ Invalidate CDN """
        def __init__(self):
            self.distribution_id = 'A1AA1AA11A11AA'
            self.client = boto3.client('cloudfront')
    
        def create_invalidation(self, file_change):
            try:
                res = self.client.create_invalidation(
                    DistributionId=self.distribution_id,
                    InvalidationBatch={
                        'Paths': {
                            'Quantity': 1,
                            'Items': ["/{}".format(file_change)]
                        },
                        'CallerReference': str(time.time()).replace(".", "")
                    }
                )
                invalidation_id = res['Invalidation']['Id']
                return invalidation_id
            except Exception as err:
                print(f"Failed to create invalidation, error {err}")
                exit(1)
    
        def get_invalidation_status(self, inval_id):
            try:
                res = self.client.get_invalidation(
                    DistributionId=self.distribution_id,
                    Id=inval_id
                )
                return res['Invalidation']['Status']
            except Exception as err:
                print(f"Failed to get invalidation status ID {inval_id}, error {err}")
                exit(1)
    
        def run(self, key):
            print(f"Deploying CDN file: {key}")
            the_id = self.create_invalidation(key)
            count = 0
            while True:
                status = self.get_invalidation_status(the_id)
                if status == 'Completed':
                    print(f"Completed, id: {the_id}")
                    break
                elif count < 10:
                    count += 1
                    time.sleep(30)
                else:
                    print("Timeout, please check CDN")
                    break
    
    
    @app.on_s3_event(bucket='mybucket',
                     prefix='static/src/',
                     events=['s3:ObjectCreated:Put'])
    def handle_s3_event(event):
        cdn = InvalidateCDN()
        cdn.run(event.key)
    


    4. 람다 함수에 boto3를 포함하도록 requirements.txt를 업데이트합니다.




    ⚡ $ cat requirements.txt
    boto3
    


    5. 배포




    ⚡ $ chalice deploy
    






    참조: https://github.com/vumdao/cicd-invalidation-cdn/tree/master/cdn-invalidation

    좋은 웹페이지 즐겨찾기