こちらの記事は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では一緒に働く仲間を募集しています!
採用情報や採用ウィッシュリストも是非ご覧ください!