LocalStackでAWSのモックコンテナを利用する

AWS環境をモックサーバ化した「LocalStack」をDockerコンテナで使ってみます。

GitHubからdocker-composeファイルをダウンロードして起動するだけでとりあえず使えます。
>curl https://raw.githubusercontent.com/localstack/localstack/master/docker-compose.yml > docker-compose.yaml

>docker-compose up -d

Creating network "desktop_default" with the default driver
Pulling localstack (localstack/localstack:latest)...
latest: Pulling from localstack/localstack
e013b3d5381d: Pull complete                                                                                             Digest: sha256:7a3f2d073146b7dd6489109c29e337e39350894914dbb12bffae4bfe30a26786
Status: Downloaded newer image for localstack/localstack:latest
Creating desktop_localstack_1 ... done   

>curl http://localhost:4566/
{"status": "running"}
過去の情報だとサービスごとにポートが分かれてるみたいなんですが、2020/09/15のリリースからは4566ポートのみを使うようになっているようです。
何か8080でダッシュボードが見れるって情報もあるんですがこれもなぜだか見れません…。

とりあえず
AWS CLIからS3を使ってみます。
>aws configure --profile localstack
AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: ap-northeast-1
Default output format [None]: json

>aws s3 mb s3://mybucket --profile localstack --endpoint-url=http://localhost:4566
make_bucket: mybucket

>aws s3 ls --profile localstack --endpoint-url=http://localhost:4566
2020-12-28 15:10:10 mybucket
DynamoDBも使ってみます。
$ aws dynamodb create-table --table-name 'mytable' \
--attribute-definitions '[{"AttributeName":"key","AttributeType": "S"}]' \
--key-schema '[{"AttributeName":"key","KeyType": "HASH"}]' \
--provisioned-throughput '{"ReadCapacityUnits": 5,"WriteCapacityUnits": 5}' \
--endpoint-url=http://localhost:4566
$ aws dynamodb put-item --table-name mytable --item '{"key":{"S": "001"}, "name":{"S": "dog"}}' --endpoint-url=http://localhost:4566
$ aws dynamodb scan --table-name mytable --endpoint-url=http://localhost:4566
{
    "Items": [
        {
            "name": {
                "S": "dog"
            },
            "key": {
                "S": "001"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}
作ったリソースはコンテナを落とすと消えるので注意しましょう。

今度はPHPでSDKから使ってみます。
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;

$s3client = S3Client::factory([
    'endpoint' => 'https://127.0.0.1:4566',
    'credentials' => [
        'key'       => 'test',
        'secret'    => 'test',
    ],
    'region' => 'ap-northeast-1',
    'version' => 'latest',
]);

$file    = date('YmdHis') . '.txt';
$content = 'LoaclStack S3 upload file.';
file_put_contents($file, $content);

$result = $s3client->putObject([
    'Bucket'        => 'mybucket',
    'Key'           => 'test.txt',
    'SourceFile'    => $file,
    'ContentType'   => mime_content_type($file),
]);

$result = $s3client->getObject([
    'Bucket' => 'mybucket',
    'Key'    => 'test.txt',
]);

echo $result['Body'];
>php s3.php
LoaclStack S3 upload file.
「endpoint」を指定することで、モックとして本物のAWS環境と変わりなく利用することができています。

ローカル開発環境をDockerで配布するときなどに便利に使えそうです。