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 Bucket を一覧表示

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 の例

Queue を作成:

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"}'

2回受信して 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 Topic を一覧表示

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"