chalice 튜토리얼 (SQS + Lambda) Part II/III

아카·2021년 2월 7일
1

AWS

목록 보기
4/6

저번 튜토리얼 보기

큐(Queue) 생성

저번 시간에 chalice 함수를 간단하게 만들어보았으니, 이제 직접 우리가 사용할 Queue를 만들어보자.

AWS colsole -> SQS 검색 -> 대기열 생성으로 간단하게 만들 수 있다.

특별한 세팅은 사용하지 않을 것이므로, 일단 모든 세팅은 건드리지 않고 큐(대기열)만 생성하도록 하자.

여기서는 편의상 my-queue라는 큐를 생성했다.
이제 Lambda Function에서 my-queue에 메세지를 푸쉬하는 방법을 알아보자.

AWS queue에 메세지를 넣는 방법은 여러가지가 있겠지만, 우리는 boto3를 통해 메세지를 보내 보자.

boto3의 문서를 보면, 쓸만한 예제를 찾을 수 있다.(https://boto3.amazonaws.com/v1/documentation/api/latest/guide/sqs.html).

Using an existing queue
It is possible to look up a queue by its name. If the queue does not exist, then an exception will be thrown:

# Get the service resource
sqs = boto3.resource('sqs')

# Get the queue. This returns an SQS.Queue instance
queue = sqs.get_queue_by_name(QueueName='test')

# You can now access identifiers and attributes
print(queue.url)
print(queue.attributes.get('DelaySeconds'))

정리하자면,

  • sqs = boto3.resoure('sqs')는 sqs에 대한 접근을 하겠다는 것이고
  • queue = sqs.get_queue_by_name(QueueName='test')는 test라는 큐 이름을 가진 큐에 접근하는 것이다.
  • queue의 attributes.get('attribute_name')을 사용하면 queue의 여러 설정 값을 가져올 수 있다.

아래쪽에 또 다른 예제를 보면, 실제로 메세지를 어떻게 보내는지 규격이 나와 있다.

Sending messages
Sending a message adds it to the end of the queue:

# Get the service resource
sqs = boto3.resource('sqs')

# Get the queue
queue = sqs.get_queue_by_name(QueueName='test')

# Create a new message
response = queue.send_message(MessageBody='world')

# The response is NOT a resource, but gives you a message ID and MD5
print(response.get('MessageId'))
print(response.get('MD5OfMessageBody'))

이 코드 또한 요약하면 다음과 같다.rs156oed8a

  • 위와 같이 queue를 선언하고, queue.send_message()를 통해 메세지를 보낼 수 있다.

즉, 우리의 lambda function에 sqs 부분과 queue 부분, 그리고 response 부분을 추가하면 된다는 것이다.

예전에(튜토리얼의 파트 1) 만들어준 Lambda function으로 돌아가보자.

...
@app.route('/request/{name}')
def index(name):
    return {'user': name}
...

이 부분을 수정해서 /request/{name}이 들어오면 {'id':name}라는 string을 큐에 보내도록 만들어보자. 수정해서 만들어보면 다음과 같다.

...
@app.route('/request/{name}')
def index(name):
    sqs = boto3.resource('sqs')
    message_string = str({'name': name})
    queue = sqs.get_queue_by_name(QueueName='my-queue')
    response = queue.send_message(MessageBody=message_string)
    return {'message': 'send'}
...

이렇게 수정하고 chalice deploy를 실행하면 에러가 난다.

이것은 우리의 Lambda Function이 queue에 접근할 권한이 없는 것이므로, 권한을 설정해주면 된다. chalice deploy에서 자동적으로 만들어지는 ARN을 콘솔에서 확인할 수 있다.

(.venv) $: ~/chalice/app$ chalice deploy
Creating deployment package.
Reusing existing deployment package.
Updating policy for IAM role: app-dev
Updating lambda function: app-dev
Updating rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-2:XXXXXXXXXX:function:app-dev
  - Rest API URL: https://XXX.execute-api.ap-northeast-2.amazonaws.com/api/

AWS Console -> 역할(role)을 찾아서 위의 Lambrs156oed8ada ARN 항목을 찾아 들어가보면 다음과 같은 페이지가 나올 것이다.

정책 연결 버튼을 눌러서 SQS에 대한 모든 권한(AmazonSQSFullAccess)을 주도록 하자.

다시 https://{Your API Gateway}.execute-api.ap-northeast-2.amazonaws.com/api/request/zetbouaka/requests/Test/를 접속하면 다음과 같은 메세지({'message':'send'})를 확인할 수 있다.

profile
코딩한량.

0개의 댓글