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-queue

SNS

建立 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 true

SNS 與 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"