👌

AWSをローカルで試せる LocalStack を使ってみる

2022/09/03に公開

LocalStackとは?

LocalStack は、クラウド アプリケーションを開発するための使いやすいテスト/モック フレームワークです。 LocalStack を使用すると、ローカルのテスト環境を数秒で立ち上げることができ、実際の AWS 環境と同じ機能を得ることができます。

https://localstack.cloud/

無料で使えるものと有料のものがあるが、以下で確認できる。
(思っていたより有料のものが多い印象だが、S3やLambda、DynamoDBなど基礎的なAWSサービスは無料で試せるのでかなり嬉しい。)。
https://docs.localstack.cloud/aws/feature-coverage/

準備

以下を参考に準備をしていく。

https://github.com/localstack/localstack#requirements

前提条件

  • python (Python 3.7 ~ 3.10)
  • pip (Python package manager)
  • Docker

LocalStackのインストール

pip install localstack

rootではないユーザーで実行すること(sudoもNG)。

確認

$ localstack --version
1.0.4

LocalStackの起動

$ localstack start -d

     __                     _______ __             __
    / /   ____  _________ _/ / ___// /_____ ______/ /__
   / /   / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
  / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
 /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|

 💻 LocalStack CLI 1.0.4

[14:57:10] starting LocalStack in Docker mode 🐳               localstack.py:138
           preparing environment                                bootstrap.py:667
           configuring container                                bootstrap.py:675
           starting container                                   bootstrap.py:681
[14:57:11] detaching                                            bootstrap.py:685

LocalStackの状態チェック

$ localstack status services
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
┃ Service                  ┃ Status      ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
│ acm                      │ ✔ available │
│ apigateway               │ ✔ available │
│ cloudformation           │ ✔ available │
│ cloudwatch               │ ✔ available │
│ config                   │ ✔ available │
│ dynamodb                 │ ✔ available │
│ dynamodbstreams          │ ✔ available │
│ ec2                      │ ✔ available │
│ es                       │ ✔ available │
│ events                   │ ✔ available │
│ firehose                 │ ✔ available │
│ iam                      │ ✔ available │
│ kinesis                  │ ✔ available │
│ kms                      │ ✔ available │
│ lambda                   │ ✔ available │
│ logs                     │ ✔ available │
│ opensearch               │ ✔ available │
│ redshift                 │ ✔ available │
│ resource-groups          │ ✔ available │
│ resourcegroupstaggingapi │ ✔ available │
│ route53                  │ ✔ available │
│ route53resolver          │ ✔ available │
│ s3                       │ ✔ available │
│ s3control                │ ✔ available │
│ secretsmanager           │ ✔ available │
│ ses                      │ ✔ available │
│ sns                      │ ✔ available │
│ sqs                      │ ✔ available │
│ ssm                      │ ✔ available │
│ stepfunctions            │ ✔ available │
│ sts                      │ ✔ available │
│ support                  │ ✔ available │
│ swf                      │ ✔ available │
└──────────────────────────┴─────────────┘

CLIのインストール

LocalStackを操作するには様々な方法がある(下記参照)。

https://docs.localstack.cloud/integrations/#integrations

今回はawslocalを使う。
awslocalawscliのLocalStack用ラッパーであり、いくつかのパラメータ指定などを省略できる。

https://docs.localstack.cloud/integrations/aws-cli/#localstack-aws-cli-awslocal

$ pip install awscli-local[ver1]

確認

$ awslocal --version
aws-cli/1.25.62 Python/3.8.2 Darwin/21.6.0 botocore/1.27.61

実践

まずはS3の静的Webサイトホスティングを試してみる。
手順は以下のサイトを参考にした(クラウドのAWSをつかった手順なので、適宜読み替え)。

https://dev.classmethod.jp/articles/amazon-s3-website-hosting-with-aws-cli/

S3の静的Webサイトホスティング

バケットの作成

$ awslocal s3api create-bucket --bucket sample-bucket
{
    "Location": "/sample-bucket"
}

バケットの確認

$ awslocal s3api list-buckets
{
    "Buckets": [
        {
            "Name": "sample-bucket",
            "CreationDate": "2022-09-03T00:15:06.000Z"
        }
    ],
    ~~
}

バケットのアクセスブロックを設定

$ awslocal s3api put-public-access-block --bucket sample-bucket --public-access-block-configuration  "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"

確認

$ awslocal s3api get-public-access-block --bucket sample-bucket
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}

ポリシーのアタッチ

ポリシーの内容

以下の内容でpolicy.jsonを作成する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow", 
            "Principal": "*", 
            "Action": "s3:GetObject", 
            "Resource": "arn:aws:s3:::for-test-page/*" 
        } 
    ] 
}

アタッチ

$ awslocal s3api put-bucket-policy --bucket sample-bucket --policy file://policy.json
確認
$ awslocal s3api get-bucket-policy --bucket sample-bucket | jq
{
  "Policy": "{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\", \n            \"Principal\": \"*\", \n            \"Action\": \"s3:GetObject\", \n            \"Resource\": \"arn:aws:s3:::for-test-page/*\" \n        } \n    ] \n}\n"
}

表示したいWebページのアップロード

Webページ(index.html)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
            <title>test page</title>
    </head>
    <body>
        This is test page.
    </body>
</html>

アップロード

$ awslocal s3 cp index.html s3://sample-bucket/index.html
upload: ./index.html to s3://sample-bucket/index.html  

Webサイトの設定

$ awslocal s3 website s3://sample-bucket --index-document index.html

ブラウザからのアクセス

ポート番号の確認

$ localstack config show | grep EDGE_PORT
│ EDGE_PORT                        │ 4566            │
│ EDGE_PORT_HTTP                   │ 0

ブラウザでアクセス

LocalStackでは、リージョン名を省いて指定できる。

  • <bucket-name>.s3.<region>.localhost.localstack.cloud
  • <bucket-name>.s3.<region>.amazonaws.com
  • <bucket-name>.localhost.localstack.cloud

今回はbucket-namesample-bucket、ポートは4566なのでURLは下記となる。

https://sample-bucket.localhost.localstack.cloud:4566/index.html

ブラウザでアクセスすると、index.htmlに設定した内容が表示される。はず。

所感

  • 料金などの心配をせずにAWSの勉強ができる。
  • これはawscliの仕様なのかもしれないが、操作によっては何も表示されない場合があり成功したのか失敗したのかがわかりにくい。
  • いろいろ試してみたい。

Discussion