LocalStack
LocalStack 是一個在本地環境模擬 AWS 雲端服務的工具,適合開發與測試。
S3
建立 S3 Bucket
aws --endpoint-url=http://localhost:4566 s3api create-bucket --bucket my-local-bucket --region us-east-1輸出:
{
"Location": "/my-local-bucket"
}列出 S3 Buckets
aws --endpoint-url=http://localhost:4566 s3api list-buckets輸出:
{
"Buckets": [
{
"Name": "my-local-bucket",
"CreationDate": "2024-03-11T14:58:54+00:00"
}
],
"Owner": {
"DisplayName": "webfile",
"ID": "75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a"
}
}上傳物件到 Bucket
aws --endpoint-url=http://localhost:4566 s3api put-object --bucket my-local-bucket --key mytestingfile.txt --body=mytestingfile.txt輸出:
{
"ETag": "\"e9486e179a81fd5a256bbe06ddfba273\"",
"ServerSideEncryption": "AES256"
}列出 Bucket 中的物件
aws --endpoint-url=http://localhost:4566 s3api list-objects --bucket my-local-bucket輸出:
{
"Contents": [
{
"Key": "mytestingfile.txt",
"LastModified": "2024-03-11T15:01:55+00:00",
"ETag": "\"e9486e179a81fd5a256bbe06ddfba273\"",
"Size": 42,
"StorageClass": "STANDARD",
"Owner": {
"DisplayName": "webfile",
"ID": "75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a"
}
}
]
}SQS
建立 Queue
awslocal sqs create-queue --queue-name localstack-queue輸出:
{
"QueueUrl": "http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/localstack-queue"
}列出 Queue
awslocal sqs list-queues輸出:
{
"QueueUrls": [
"http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/localstack-queue"
]
}查詢 Queue 屬性
awslocal sqs get-queue-attributes --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/localstack-queue --attribute-names All輸出:
{
"Attributes": {
"ApproximateNumberOfMessages": "0",
"ApproximateNumberOfMessagesNotVisible": "0",
"ApproximateNumberOfMessagesDelayed": "0",
"CreatedTimestamp": "1710818989",
"DelaySeconds": "0",
"LastModifiedTimestamp": "1710818989",
"MaximumMessageSize": "262144",
"MessageRetentionPeriod": "345600",
"QueueArn": "arn:aws:sqs:us-east-1:000000000000:localstack-queue",
"ReceiveMessageWaitTimeSeconds": "0",
"VisibilityTimeout": "30",
"SqsManagedSseEnabled": "true"
}
}發送與接收訊息
發送訊息:
awslocal sqs send-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/localstack-queue --message-body "Hello World"輸出:
{
"MD5OfMessageBody": "b10a8db164e0754105b7a99be72e3fe5",
"MessageId": "2962d260-733c-4e0a-8418-ab532906039c"
}接收訊息:
awslocal sqs receive-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/localstack-queue輸出:
{
"Messages": [
{
"MessageId": "2962d260-733c-4e0a-8418-ab532906039c",
"ReceiptHandle": "ZDc5OWQzMzUtZWVkZS00OTMwLWEwZDktMGE4Yzg3ZTE2ZGVjI...",
"MD5OfBody": "b10a8db164e0754105b7a99be72e3fe5",
"Body": "Hello World"
}
]
}Dead-Letter Queue 範例
建立 Queues:
awslocal sqs create-queue --queue-name input-queue
awslocal sqs create-queue --queue-name dead-letter-queue
awslocal sqs create-queue --queue-name recovery-queue設定 Redrive Policy:
awslocal sqs set-queue-attributes \
--queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/input-queue \
--attributes '{
"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:000000000000:dead-letter-queue\",\"maxReceiveCount\":\"1\"}"
}'發送訊息到 input-queue:
awslocal sqs send-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/input-queue --message-body '{"hello": "world"}'接收兩次觸發 DLQ:
awslocal sqs receive-message --visibility-timeout 0 --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/input-queue
awslocal sqs receive-message --visibility-timeout 0 --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/input-queue將 DLQ 訊息移動到 recovery-queue:
awslocal sqs start-message-move-task \
--source-arn arn:aws:sqs:us-east-1:000000000000:dead-letter-queue \
--destination-arn arn:aws:sqs:us-east-1:000000000000:recovery-queue從 recovery-queue 接收訊息:
awslocal sqs receive-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/recovery-queueSNS
建立 SNS Topic
awslocal sns create-topic --name localstack-topic輸出:
{
"TopicArn": "arn:aws:sns:us-east-1:000000000000:localstack-topic"
}設定 Topic 屬性
awslocal sns set-topic-attributes \
--topic-arn arn:aws:sns:us-east-1:000000000000:localstack-topic \
--attribute-name DisplayName \
--attribute-value MyTopicDisplayName列出 SNS Topics
awslocal sns list-topics輸出:
{
"Topics": [
{
"TopicArn": "arn:aws:sns:us-east-1:000000000000:localstack-topic"
}
]
}取得 Topic 屬性
awslocal sns get-topic-attributes \
--topic-arn arn:aws:sns:us-east-1:000000000000:localstack-topic發佈訊息到 Topic
awslocal sns publish \
--topic-arn "arn:aws:sns:us-east-1:000000000000:localstack-topic" \
--message file:///opt/code/localstack/message.txt輸出:
{
"MessageId": "f9e062ca-df27-4647-9c95-f89a3f77ed86"
}訂閱 SNS Topic
Email 訂閱:
awslocal sns subscribe \
--topic-arn arn:aws:sns:us-east-1:000000000000:localstack-topic \
--protocol email \
--notification-endpoint test@gmail.com輸出:
{
"SubscriptionArn": "arn:aws:sns:us-east-1:000000000000:localstack-topic:13c3866a-9b7f-4f96-9762-c60809a2da05"
}設定訂閱屬性:
awslocal sns set-subscription-attributes \
--subscription-arn "arn:aws:sns:us-east-1:000000000000:localstack-topic:13c3866a-9b7f-4f96-9762-c60809a2da05" \
--attribute-name RawMessageDelivery --attribute-value trueSNS 與 SQS 整合
建立 SQS Queue:
awslocal sqs create-queue --queue-name my-queue訂閱 SQS 到 SNS:
awslocal sns subscribe --topic-arn "arn:aws:sns:us-east-1:000000000000:localstack-topic" --protocol sqs --notification-endpoint "arn:aws:sqs:us-east-1:000000000000:my-queue"發佈訊息:
awslocal sns publish --topic-arn "arn:aws:sns:us-east-1:000000000000:localstack-topic" --message "hello"從 SQS 接收:
awslocal sqs receive-message --queue-url "http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/my-queue"列出訂閱者
awslocal sns list-subscriptions取消訂閱
awslocal sns unsubscribe --subscription-arn "arn:aws:sns:us-east-1:000000000000:localstack-topic:9825fc88-3d58-471c-92ad-08524e9f8301"