hacomono TECH BLOG

フィットネスクラブやスクールなどの顧客管理・予約・決済を行う、業界特化型SaaS「hacomono」を提供する会社のテックブログです!

LocalStackで簡単AWS開発

こちらの記事はhacomono Advent Calendar 2023の12日目の記事です

自己紹介

おはこんばんちは。 hacomono 開発部の iwazer です。

久しぶりの登場ですが、この間にティアキンも Cyberpunk2077 最終 DLC も Starfield も全部発売されました。
みなさんクリアしたでしょうか。私はクリアしました。

今回は AWS を使った開発をラクチンにしてくれる LocalStack について軽く書こうと思います。

概要

LocalStack はローカル環境でAWSクラウドサービスをエミュレートするためのフレームワークです。
AWS に実際に接続することなく AWS を使ったアプリケーションを動かしながら開発することができます。
ここ最近、利用できるようになったサービスが一気に増えたようです。
そのうち高度なものは Pro 以上の有料版を必要としますが、無料のコミュニティ版でサポートされているサービスも十分役に立つラインナップになっていると感じます。

簡単なサンプルを紹介しつつ、手軽さを実感してもらえれば嬉しいです。

動かしてみる

docker-compose を使って起動するのが手っ取り早いと思います。

とりあえず SystemManager と S3 サービスのみで起動してみます。
environment/SERVICES にカンマ区切りでサービスを複数、指定できます。

> cat docker-compose-localstack.yml
version: "3.8"

services:
  localstack:
    image: localstack/localstack
    environment:
      - SERVICES=ssm,s3
    ports:
      - 4566:4566
> docker-compose -f docker-compose-localstack.yml up -d
  :
 ✔ Container docker-localstack-1  Started

aws コマンドが使えるように Credential を作っておきます。

> aws configure
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [ap-northeast-1]:
Default output format [None]:

> cat ~/.aws/credentials
[default]
aws_access_key_id = dummy
aws_secret_access_key = dummy

S3 に画像を格納してみます。

> ls -l ./images
-rw-r--r--@ 1 iwazzer  staff  419138 12  7 17:39 sample.png

> aws --endpoint-url <http://localhost:4566> s3 mb s3://images
make_bucket: images

> aws --endpoint-url <http://localhost:4566> s3 ls
2023-12-07 17:40:58 images

> aws --endpoint-url <http://localhost:4566> s3 cp images/sample.png s3://images/background.png
upload: images/sample.png to s3://images/background.png

Parameter Store に S3 に格納した情報を登録してみます。

> aws --endpoint-url <http://localhost:4566> ssm put-parameter \\
  --name '/background-image' \\
  --type 'String' \\
  --value 'background.png'
{
    "Version": 1
}

> aws --endpoint-url <http://localhost:4566> ssm get-parameter --name '/background-image'
{
    "Parameter": {
        "Name": "/background-image",
        "Type": "String",
        "Value": "background.png",
        "Version": 1,
        "LastModifiedDate": "2023-12-07T17:44:01.051000+09:00",
        "ARN": "arn:aws:ssm:ap-northeast-1:000000000000:parameter/background-image",
        "DataType": "text"
    }
}

というふうに、とても簡単に利用できます。

アプリケーションから利用する

当たり前ですが AWS が提供している SDK を使ってアクセスすることができます。

私達は主に Ruby / Rails を使ってサービス開発しておりますので、Ruby の例で紹介します。

使う aws-sdk をインストールします。

> gem install aws-sdk-s3
> gem install aws-sdk-ssm

Parameter Store から情報を取得します。(aws-sdk-ssm reference

> irb
3.0.6 :001 > require 'aws-sdk-ssm'
#=> true

3.0.6 :002 > require 'aws-sdk-s3'
#=> true

3.0.6 :003 > ssm_client = Aws::SSM::Client.new(region: 'ap-northeast-1', access_key_id: 'dummy', secret_access_key: 'dummy', endpoint: '<http://localhost:4566>')
#=> #<Aws::SSM::Client>

3.0.6 :004 > r = ssm_client.get_parameter(name: '/background-image')
#=>
#<struct Aws::SSM::Types::GetParameterResult
...

3.0.6 :005 > file = r.parameter.value
#=> "background.png"

続いて、S3 からイメージファイルを取得します。(aws-sdk-s3 reference

3.0.6 :006 > s3_client = Aws::S3::Client.new(region: 'ap-northeast-1', access_key_id: 'dummy', secret_access_key: 'dummy', endpoint: '<http://localhost:4566>', force_path_style: true)
#=> #<Aws::S3::Client>

3.0.6 :007 > r = s3_client.get_object(bucket: 'images', key: file)
#=>
#<struct Aws::S3::Types::GetObjectOutput
...

3.0.6 :008 > File.open('./images/downloaded.png', 'w') { |f| f.write(r.body.read) }
#=> 419138

> ls -l ./images
-rw-r--r--  1 iwazzer  staff  419138 12  7 18:38 downloaded.png
-rw-r--r--@ 1 iwazzer  staff  419138 12  7 17:39 sample.png

ローカルだけで実際に動かしてみながらコーディングできるので、スムーズに開発できます。
デプロイ後に期待通りに動くかは aws-sdk のクライアントインスタンスを生成する Credential の違いだけ気にすれば良いでしょう。

LocalStackがサポートしているサービス

サポートしているサービスを知るには公式の AWS Service Feature Coverage を参照してください。

無料のコミュニティ版でも StepFunctions, Lambda, DynamoDB など、よく使われるサービスが含まれていて有用です。

Pro とマークされているサービスは有償の Pro 版でのサポートです。
ECS, EKS, Cognito, CloudFront など、ローカルで手軽に試せれば便利そうなので、いちど使ってみたいと考えています。どこまでできるのか気になりますね。

その際はまたエントリーを書こうかなと考えています。

まとめ

LocalStack は AWS サービスを使った開発を、とても手軽にしてくれる大変便利なプロダクトです。
サポートされているサービスが増えたことで、多くの現場で使える機会が増えたと思います。
AWS を使った開発のトライアンドエラーをしやすくなり、敷居を下げてくれる効果が期待できますね。
単体テストにも利用できると思いますが、そちらはモックを使ったほうがいいかなと個人的には思います(といいつつ一部使っていますが。笑


株式会社hacomonoでは一緒に働く仲間を募集しています!
採用情報や採用ウィッシュリストも是非ご覧ください!