こんにちは、シローです。
ここ最近新しいことばかり、吸収します。(NginxやShellScriptなどいじっていた頃と比べて)
ということで、ServerlessFrameworkでAPIGatewayのWebsocketを使ったチャットサービスの作成方法をまとめました。
前回の記事(https://shiro-secret-base.com/?p=987)をより本格的にしたものとなります。
今回はDockerの環境構築までです。(全体だと長くなっちゃうので分割しますw)
環境など
OS | macOS Big Sur 11.3.1 |
docker | version 3.3.3 |
docker-compose | version 1.29.1 |
最終的な成果物のディレクトリ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
. ├── .env ├── docker │ ├── dynamodb │ └── serverless │ ├── Dockerfile │ └── startup.sh ├── docker-compose.yml └── serverless └── src ├── dynamodb-tables │ ├── ChatMessage.yml │ └── UserConnection.yml ├── functions │ ├── models │ │ ├── ChatMessage.js │ │ └── UserConnection.js │ ├── modules │ │ ├── apiGw.js │ │ └── dynamodbClient.js │ └── socket │ ├── connect │ │ └── index.js │ ├── disconnect │ │ └── index.js │ └── sendMessage │ └── index.js ├── package-lock.json ├── package.json └── serverless.yml |
docker-compose.ymlでserverlessとdynamodbのサービスをコンテナを立ち上げて、
dockerディレクトリ配下にそれぞれのサービスごとにディレクトリを切っています。
serverlessディレクトリではServerlessFrameworkを使った、WebSocketでのチャットサービスのプロジェクトのソースを管理しています。
また、ServerlessFrameworkの設定を行うために、aws-cliを利用するためのアクセスキー、シークレットキーが必要になります。(ローカルにも関わらず)
Docker環境の作成
このチャットサービスはDockerのコンテナ上で動くことを前提としています。
他の人でもコマンド一発で立ち上げられることでチーム開発のスピードをあげれる点で便利です。
今回はServerlessFrameworkのサービスを立ち上げるためのserverlessコンテナ、チャットで扱うデータを管理するためのdynamodbコンテナを作成します。
まずはプロジェクトのディレクトリ直下に以下の構成でファイル、フォルダを作成します。
1 2 3 4 5 6 7 8 9 10 |
$ tree . ├── .env ├── docker/ │ ├── dynamodb/ │ └── serverless/ │ ├── Dockerfile │ └── startup.sh ├── docker-compose.yml └── serverless/ |
docker-compose.ymlの記述
./docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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} - AWS_REGION=${AWS_REGION} tty: true stdin_open: true env_file: - ./.env depends_on: - dynamodb volumes: - ./serverless/src:/app working_dir: /app ports: - "3334:3000" dynamodb: image: amazon/dynamodb-local:latest ports: - "8889:8000" command: "-jar DynamoDBLocal.jar -sharedDb -optimizeDbBeforeStartup -dbPath ./data" volumes: - ./docker/dynamodb:/home/dynamodblocal/data working_dir: /home/dynamodblocal |
dynamodbコンテナはdynamodb-local
というイメージを利用しています。(https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html)
ポートフォワードについてはWebSocketは"3334"、dynamodbは"8889"です。
.envの記述
sls
コマンドで必要になるためAWSコンソールのIAMの認証情報から作成したアクセスキー、シークレットキーとリージョン名を記載します。
./.env
1 2 3 |
AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXX AWS_REGION=ap-northeast-1 |
Dockerfileの記述
serverlessコンテナではsls
コマンドのインストールやLambda関数をNode.jsを使って記述するため、node.jsのイメージを利用します。
そのイメージで扱うモジュールのインストールや、起動用スクリプトであるstartup.sh
を実行するための記述をDockerfileにします。
./docker/serverless/Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
FROM node:14 ARG AWS_ACCESS_KEY_ID ARG AWS_SECRET_ACCESS_KEY ARG AWS_REGION RUN echo ${AWS_ACCESS_KEY_ID} 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 RUN npm install -g serverless-offline RUN npm install -g serverless-websockets-plugin RUN npm i -g wscat RUN aws configure set region ${AWS_REGION} RUN sls config credentials --provider aws --key ${AWS_ACCESS_KEY_ID} --secret ${AWS_SECRET_ACCESS_KEY} EXPOSE 3000 # COPY startup.sh /opt/startup.sh # RUN chmod 777 /opt/startup.sh # CMD ["/bin/bash", "/opt/startup.sh"] |
下3行はコメントアウトします。理由はまだサーバレスのプロジェクトが./serverlessディレクトリに展開されていないためです。
startup.shの記述
./docker/serverless/startup.sh
1 |
#!/bin/bash |
今のところはこれだけです、理由は一旦sls
コマンドでServerlessFrameworkの環境を構築していくためです。
サーバレス環境の下地が整ってきたら自動で起動するためのコマンドなどの記述をしていきます。
Docker環境の起動
起動自体はdocker-compose up
コマンドで行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ docker-compose up Docker Compose is now in the Docker CLI, try `docker compose up` . . . Starting serverless-chat-copy_dynamodb_1 ... done Recreating serverless-chat-copy_serverless_1 ... done Attaching to serverless-chat-copy_dynamodb_1, serverless-chat-copy_serverless_1 dynamodb_1 | Initializing DynamoDB Local with the following configuration: dynamodb_1 | Port: 8000 dynamodb_1 | InMemory: false dynamodb_1 | DbPath: ./data dynamodb_1 | SharedDb: true dynamodb_1 | shouldDelayTransientStatuses: false dynamodb_1 | CorsParams: * dynamodb_1 | serverless_1 | Welcome to Node.js v16.3.0. serverless_1 | Type ".help" for more information. |
コンテナが起動しているのをdocker-compose ps
コマンドで確認します。
1 2 3 4 5 |
$ docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------------------------------- serverless-chat-copy_dynamodb_1 java -jar DynamoDBLocal.ja ... Up 0.0.0.0:8889->8000/tcp,:::8889->8000/tcp serverless-chat-copy_serverless_1 docker-entrypoint.sh node Up 0.0.0.0:3334->3000/tcp,:::3334->3000/tcp |
serverlessとdynamodbのポートフォワードがそれぞれ("3334" <=> "3000", "8889" <=> "8000")となっていれば成功です。
とりあえずはここまでとします、次回の投稿をお待ちください。
本書では、技術者だけでなく、IT基盤の方向性の検討や戦略の立案、意思決定を行う立場の方が、導入前の検討を実践できる内容を盛り込みました。具体的には、コンテナの特徴、導入時の検討項目、注意点などのチェックリストを設け、システム構成例などを解説図にまとめ、要点を把握しやすいようにしました。また、大規模データセンター向けのコンテナ基盤構築の経験がない技術者でも、その基礎を理解できるよう、Dockerのインストール手順、使用法などを具体的に記載しています。