- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2019-05-09T02:24:45+00:00","","")
#author("2019-05-11T21:28:14+00:00","","")
#mynavi(AWSメモ)
#setlinebreak(on);
* 目次 [#uf13510d]
#contents
- 参考
-- [[https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html]]
-- [[https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sqs.html]]
* 概要 [#ca7e569d]
#html(<div style="padding-left: 10px;">)
#html(</div>)
* 準備 [#o28a9ab3]
#html(<div style="padding-left: 10px;">)
** キューの作成 [#r749fef8]
#html(<div style="padding-left: 10px;">)
template_normal.yml
#mycode2(){{
AWSTemplateFormatVersion: "2010-09-09"
Description: sample sqs
Resources:
SampleQueue01:
Type: AWS::SQS::Queue
Properties:
QueueName: "SampleQueue01" # キュー名(FIFOキューにする場合は末尾は .fifo にする必要がある)
Outputs:
SampleQueue01:
Export:
Name: SampleQueue01Name
Value: !GetAtt SampleQueue01.QueueName
}}
template_fifo.yml
#mycode2(){{
AWSTemplateFormatVersion: "2010-09-09"
Description: sample sqs
Resources:
SampleFifoQueue01:
Type: AWS::SQS::Queue
Properties:
QueueName: "SampleQueue01.fifo" # キュー名(FIFOキューにする場合は末尾は .fifo にする必要がある)
FifoQueue: true # FIFOキューにする場合はtrue
#ReceiveMessageWaitTimeSeconds: 0 # 待機期間 ※ デフォルト: 0(1 〜 20) ※1以上を指定するとデフォルトでロングポーリングとなる
Outputs:
SampleFifoQueue01:
Export:
Name: SampleFifoQueue01Name
Value: !GetAtt SampleFifoQueue01.QueueName
}}
#html(</div>)
#html(</div>)
* 実装 [#i0bd24de]
#html(<div style="padding-left: 10px;">)
** メッセージ送信処理 [#f65d4603]
#html(<div style="padding-left: 10px;">)
sqs_send_messages.py
#mycode2(){{
# TODO
import argparse
import boto3
import uuid
import re
def main(queue_name, count):
"""
メッセージ送信.
Args:
queue_name (str): キュー名
count (int): 送信数
"""
sqs = boto3.resource('sqs')
queue = sqs.get_queue_by_name(QueueName=queue_name)
# メッセージ作成
entries = [{'Id': str(uuid.uuid1()), 'MessageBody': f'Sample Message {i}!'} for i in range(count)]
# fifoキューの時はパラメータ追加
if re.compile(r'.*\.fifo$').match(queue_name):
entries = [{**x, 'MessageGroupId': 'sample', 'MessageDeduplicationId': str(uuid.uuid4())} for x in entries]
# メッセージ送信
response = queue.send_messages(Entries=entries)
if 'Successful' in response:
print('sent message count: {}'.format(len(response['Successful'])))
else:
print('error!')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--queue', type=str, default="SampleQueue01", help='キュー名')
parser.add_argument('--count', type=int, default=10, help='送信メッセージ数')
args = parser.parse_args()
main(args.queue, args.count)
}}
#html(</div>)
** メッセージ受信処理 [#d04b5f8e]
#html(<div style="padding-left: 10px;">)
sqs_receive_messages.py
#mycode2(){{
mport argparse
import boto3
from datetime import datetime
import uuid
client = boto3.client('sqs')
response = client.get_queue_url(
QueueName='string',
QueueOwnerAWSAccountId='string'
)
def log(text):
print('{} {}'.format(datetime.now().strftime('%H:%M:%S.%f'), text))
response = client.receive_message(
QueueUrl='string',
AttributeNames=[
'All'|'Policy'|'VisibilityTimeout'|'MaximumMessageSize'|'MessageRetentionPeriod'|'ApproximateNumberOfMessages'|'ApproximateNumberOfMessagesNotVisible'|'CreatedTimestamp'|'LastModifiedTimestamp'|'QueueArn'|'ApproximateNumberOfMessagesDelayed'|'DelaySeconds'|'ReceiveMessageWaitTimeSeconds'|'RedrivePolicy'|'FifoQueue'|'ContentBasedDeduplication'|'KmsMasterKeyId'|'KmsDataKeyReusePeriodSeconds',
],
MessageAttributeNames=[
'string',
],
MaxNumberOfMessages=123,
VisibilityTimeout=123,
WaitTimeSeconds=123,
ReceiveRequestAttemptId='string'
}}
#html(</div>)
def main(queue_name, waitSec=0):
"""
メッセージ受信.
サービスリソースを使用する場合
#html(<div style="padding-left: 10px;">)
sqs = boto3.resource('sqs')
Args:
queue_name (str): キュー名
waitSec (int): 待機時間(秒)
"""
queue = sqs.get_queue_by_name(
QueueName='string',
QueueOwnerAWSAccountId='string'
)
log(f'receive start (wait:{waitSec})')
sqs = boto3.resource('sqs')
queue = sqs.Queue('url')
queue = boto3.resource('sqs').get_queue_by_name(QueueName=queue_name)
receive_messages
# キューにメッセージがなくなるまで受信
process_count = 0
received_count = 0
while True:
process_count += 1
log(f' ## times: {process_count}')
messages = queue.receive_messages(
MaxNumberOfMessages=10,
VisibilityTimeout=10,
WaitTimeSeconds=waitSec
)
for m in messages:
log(f' {m.body}')
m.delete()
log(' ## received count: {} ##'.format(len(messages)))
received_count += len(messages)
if len(messages) == 0:
break
log(f'all received count: {received_count}')
log('receive end')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--queue', type=str, default="SampleQueue01", help='キュー名')
parser.add_argument('--wait', type=int, default=0, help='ロングポーリングの待ち時間(秒)')
args = parser.parse_args()
main(args.queue, args.wait)
}}
#html(</div>)
#html(</div>)
* 動作確認 [#ua272835]
#html(<div style="padding-left: 10px;">)
** WaitTimeSeconds = 0 の時 [#b5661f80]
** 標準キューからの受信 (WaitTimeSeconds=0) [#v75b590e]
#html(<div style="padding-left: 10px;">)
MaxNumberOfMessages
#myterm2(){{
# メッセージ送信
python3 sqs_send_messages.py --queue SampleQueue01
sent message count: 10
# メッセージ受信
python3 sqs_receive_messages.py --queue SampleQueue01
06:18:41.907223 receive start (wait:0)
06:18:42.161742 ## times: 1
06:18:42.219472 Sample Message 6!
06:18:42.263471 Sample Message 7!
06:18:42.305184 ## received count: 2 ##
06:18:42.305253 ## times: 2
06:18:42.338077 Sample Message 8!
06:18:42.378476 Sample Message 9!
06:18:42.413713 ## received count: 2 ##
06:18:42.413786 ## times: 3
06:18:42.455132 Sample Message 0!
06:18:42.491965 Sample Message 1!
06:18:42.534380 ## received count: 2 ##
06:18:42.534448 ## times: 4
06:18:42.571035 Sample Message 4!
06:18:42.606354 Sample Message 5!
06:18:42.645746 ## received count: 2 ##
06:18:42.645813 ## times: 5
06:18:42.694219 Sample Message 2!
06:18:42.731699 Sample Message 3!
06:18:42.766721 ## received count: 2 ##
06:18:42.766790 ## times: 6
06:18:42.850375 ## received count: 0 ##
06:18:42.850447 all received count: 10
06:18:42.850537 receive end
}}
#html(</div>)
** WaitTimeSeconds = 10 の時 [#tad005fc]
** 標準キューからの受信 (WaitTimeSeconds=5) [#s1f4b152]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
# メッセージ送信
python3 sqs_send_messages.py --queue SampleQueue01
sent message count: 10
# メッセージ受信
python3 sqs_receive_messages.py --queue SampleQueue01 --wait 5
06:19:29.850615 receive start (wait:5)
06:19:30.060734 ## times: 1
06:19:30.117383 Sample Message 0!
06:19:30.153267 Sample Message 1!
06:19:30.186305 ## received count: 2 ##
06:19:30.186363 ## times: 2
06:19:30.245380 Sample Message 2!
06:19:30.275071 Sample Message 3!
06:19:30.303633 ## received count: 2 ##
06:19:30.303690 ## times: 3
06:19:30.383249 Sample Message 6!
06:19:30.418233 Sample Message 7!
06:19:30.448917 ## received count: 2 ##
06:19:30.448974 ## times: 4
06:19:30.523434 Sample Message 4!
06:19:30.574284 Sample Message 5!
06:19:30.617360 ## received count: 2 ##
06:19:30.617428 ## times: 5
06:19:30.686887 Sample Message 8!
06:19:30.716161 Sample Message 9!
06:19:30.745607 ## received count: 2 ##
06:19:30.745666 ## times: 6
06:19:35.784671 ## received count: 0 ##
06:19:35.784741 all received count: 10
06:19:35.784770 receive end
}}
#html(</div>)
** FIFOキューからの受信(WaitTimeSeconds=0) [#b47c312d]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
# メッセージ送信
python3 sqs_send_messages.py --queue SampleQueue01.fifo
sent message count: 10
# メッセージ受信
python3 sqs_receive_messages.py --queue SampleQueue01.fifo
06:20:41.883319 receive start (wait:0)
06:20:42.145858 ## times: 1
06:20:42.203745 Sample Message 0!
06:20:42.244354 Sample Message 1!
06:20:42.285375 Sample Message 2!
06:20:42.326636 Sample Message 3!
06:20:42.368955 Sample Message 4!
06:20:42.409999 Sample Message 5!
06:20:42.450055 Sample Message 6!
06:20:42.485745 Sample Message 7!
06:20:42.539294 Sample Message 8!
06:20:42.579761 Sample Message 9!
06:20:42.621650 ## received count: 10 ##
06:20:42.621708 ## times: 2
06:20:42.708396 ## received count: 0 ##
06:20:42.708447 all received count: 10
06:20:42.708466 receive end
}}
#html(</div>)
** FIFOキューからの受信(WaitTimeSeconds=5) [#pd0d8f8d]
#html(<div style="padding-left:10px;">)
#myterm2(){{
# メッセージ送信
python3 sqs_send_messages.py --queue SampleQueue01.fifo
sent message count: 10
# メッセージ受信
python3 sqs_receive_messages.py --queue SampleQueue01.fifo --wait 5
06:24:40.971442 receive start (wait:5)
06:24:41.231637 ## times: 1
06:24:41.306999 Sample Message 0!
06:24:41.375247 Sample Message 1!
06:24:41.427477 Sample Message 2!
06:24:41.475459 Sample Message 3!
06:24:41.533345 Sample Message 4!
06:24:41.582722 Sample Message 5!
06:24:41.640533 Sample Message 6!
06:24:41.719576 Sample Message 7!
06:24:41.761849 Sample Message 8!
06:24:41.805343 Sample Message 9!
06:24:41.854775 ## received count: 10 ##
06:24:41.854845 ## times: 2
06:24:46.978988 ## received count: 0 ##
06:24:46.979064 all received count: 10
06:24:46.979091 receive end
}}
#html(</div>)
#html(</div>)