どーも、シローだ
ServerlessFramework(通称:sls)ってご存知ですか?
どうやら、AWSのApiGatewayだのLambdaだのDynamoDBといったものを組み合わせたアーキテクチャを作成してくれるもんらしいんだ(公式:https://www.serverless.com/framework/docs/getting-started/
これだとCloudFormationとあまり変わらないと思うだろうけど、slsはローカルでそのアーキテクチャを実行することができるんだと(厳密には違うところがあるって公式さんいってたが)
チーム開発では、他の人でも検証できるようにすることを一応心がけておりまして、僕はこういうのでもDocker化したいなぁと思っちゃうんです。
てなわけで今回は、ローカルでApiGateway+Lambdaの環境を立ち上げるための手順をまとめようと思います。
環境
OS | macOS Big Sur 11.3.1 |
Docker | v20.10.6 |
最終的に出来上がるファイル群
1 2 3 4 5 6 7 8 9 10 11 |
$ tree . ├── docker │ └── serverless │ ├── Dockerfile │ └── startup.sh ├── docker-compose.yml └── serverless └── src ├── handler.js └── serverless.yml |
作成手順
初期ファイルとディレクトリを作成
空っぽのファイルとディレクトリをとりあえず作成、あとから埋めるから
1 2 3 |
$ touch docker-compose.yml $ mkdir -p docker/serverless serverless/src $ touch docker/serverless/Dockerfile docker/serverless/startup.sh |
docker-compose.ymlの記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '3' services: serverless: build: context: ./docker/serverless args: - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY tty: true volumes: - ./serverless/src:/app # <= いずれ作成するサーバレスアーキテクチャをボリュームに追加 working_dir: /app ports: - 3333:3000 # <= 3000を3333にマッピング env_file: - .env |
docker-compose.ymlファイルと同じ階層にAWSアクセスキー、シークレットキーを持つ.envファイルを作成
slsを実行するときにAWSアクセスキー、シークレットキーを読み込むので
環境変数として.envファイルを作成し中にそれらの情報を書き込んどく必要がある
1 2 3 |
$ cat .env AWS_ACCESS_KEY_ID=AKIXXXXXXXXXXXXXXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXX+yyyyyyyy |
Dockerfileの記述(docker/serverless/Dockerfile)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
FROM node:latest ARG AWS_ACCESS_KEY_ID ARG AWS_SECRET_ACCESS_KEY RUN apt-get update RUN apt-get install -y \ python3-pip \ jq RUN pip3 install awscli --upgrade --user RUN pip3 install yq RUN apt-get install -y awscli RUN npm install -g serverless serverless-offline RUN sls config credentials --provider aws --key $AWS_ACCESS_KEY_ID --secret $AWS_SECRET_ACCESS_KEY EXPOSE 3000 |
上のファイルのコピペでOkなんですが、要点的なものを下にまとめる
awscliのインストール
このコンテナに入って、なんだかんだAWSコマンドを叩くかもしれないのでインストール
手順としてはpip
でインストールした後、apt
でまたインストールしないとコマンドが使えないみたいだった
1 2 3 |
$ apt-get install python3-pip $ pip3 install awscli $ apt-get install awscli |
serverlessとserverless-offlineをnpmでインストール
sls
コマンドとしてserverless
とローカル環境で実行するためのserverless-offline
をnpm
でインストール
どのプロジェクトでも使用できるように-g
つけるのを忘れないこと
1 |
$ npm i -g serverless serverless-offline |
コンテナを立ちあげて、内部に入りslsコマンドでプロジェクトを作成
1 |
$ docker-compose up |
でコンテナを立ち上げて
1 |
$ docker-compose exec serverless /bin/bash |
でコンテナに入る
そのあと、sls
コマンドでプロジェクトを作成
1 |
$ sls create --template aws-nodejs |
serverless/src
配下にhandler.js
とserverless.yml
ファイルが作成されればOk
ローカルで実行できるようserverless.ymlを編集
serverless.ymlの一番下に以下を追加
1 2 3 4 5 |
. . . plugins: - serverless-offline |
これでsls offline
と打てばローカルでサーバレスアーキテクチャを実行できるってわけだぁ
コンテナ立ち上げ時に自動でsls offlineが起動している状態にする
今の状態だとコンテナ内部に入らないとローカルで動く状態にできないので、どうせならdocker-compose up
すれば自動で立ち上がるようにしたい
Dockerfileに以下を追加
docker/serverless/Dockerfile
の一番下に以下を追加
1 2 3 4 5 6 |
. . . COPY startup.sh /opt/startup.sh RUN chmod 777 /opt/startup.sh CMD ["/bin/bash", "/opt/startup.sh"] |
startup.shの記述
1 2 3 |
#!/bin/bash cd /app sls offline --host 0.0.0.0 |
sls offline --host 0.0.0.0
がローカルで実行している部分です。(--host 0.0.0.0
が重要)
あとはローカルで確認するだけ
http://localhost:3333をブラウザで開くと
こんな画面になればめでたしめでたし〜
今回は手短に、以上!
本書では、技術者だけでなく、IT基盤の方向性の検討や戦略の立案、意思決定を行う立場の方が、導入前の検討を実践できる内容を盛り込みました。具体的には、コンテナの特徴、導入時の検討項目、注意点などのチェックリストを設け、システム構成例などを解説図にまとめ、要点を把握しやすいようにしました。また、大規模データセンター向けのコンテナ基盤構築の経験がない技術者でも、その基礎を理解できるよう、Dockerのインストール手順、使用法などを具体的に記載しています。