저번 시간에 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'))
정리하자면,
boto3.resoure('sqs')
는 sqs에 대한 접근을 하겠다는 것이고sqs.get_queue_by_name(QueueName='test')
는 test라는 큐 이름을 가진 큐에 접근하는 것이다.아래쪽에 또 다른 예제를 보면, 실제로 메세지를 어떻게 보내는지 규격이 나와 있다.
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.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'})를 확인할 수 있다.