Swagger CodeGenでダミーデータを返すスタブを出力する
Swagger codegenで言語にnodejs-serverを指定すると、Node.jsベースのRESTサーバが生成されます。基本的には空のデータを返す実装になるのですが、ある一定の条件を満たす場合は aeiou
や 123456789
といったダミーデータを返す実装を出力してくれるようです。
少し試した限りでは、responses
に深さ2以上の参照(参照の参照)を渡している場合は空データになってしまうようです。深さ1の場合はダミーデータになります。変な挙動ですね。
definitions: Pet: type: object required: - id - name properties: id: type: integer format: int64 name: type: string tag: type: string Pets: type: array items: $ref: '#/definitions/Pet' # 以下の場合は空データが返る responses: '200': description: successful operation schema: $ref: '#/definitions/Pets' # 以下の場合はダミーデータが返る responses: '200': description: successful operation schema: type: array items: $ref: '#/definitions/Pet'
swagger-codegenリポジトリにある samples/server/petstore/nodejs/controllers/PetService.js はダミーデータを返す実装になっているので、ここの書き方を参考にするとよさそうです。
ダミーデータなどではなくて、examplesに書いたJSONを返してくれるスタブを生成できるとうれしいのですが、残念ながら未実装のようです。テンプレートをカスタマイズすればできそうな気がします。
acmesmithでSSL証明書を管理する
開発環境などのテンポラリな環境でSSL証明書を利用したい場合はLet's Encryptが便利です。Let's Encryptの証明書を管理するツールにはcertbotやlegoなどがありますが、それらは鍵や証明書をローカルディスクに格納するため、他のサーバで証明書を利用したい場合に鍵や証明書を安全に配布する仕組みが必要になります。また、発行済みの証明書が複数のサーバに分散してしまうと、有効期限やSAN(Subject Alternative Name)の更新に多大な手間がかかります。
そこで、acmesmithというツールを利用すると、S3などのストレージで鍵や証明書を一元管理できます。これにより、複数のサーバで証明書を利用する場合の運用がとても楽になります。
本稿では、acmesmithを利用して証明書を運用する方法を説明します。ここでは、Route53でドメインを管理しており、S3が利用できる前提とします。
準備
以下のIAMロールを持つIAMユーザを作成します。YOUR_BUCKET
はS3のバケット名、YOUR_HOSTED_ZONE
はRoute53のゾーンIDに置き換えてください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"], "Resource": ["arn:aws:s3:::YOUR_BUCKET", "arn:aws:s3:::YOUR_BUCKET/cert"] }, { "Effect": "Allow", "Action": ["route53:ListHostedZones", "route53:GetChange"], "Resource": "*" }, { "Effect": "Allow", "Action": "route53:ChangeResourceRecordSets", "Resource": ["arn:aws:route53:::hostedzone/YOUR_HOSTED_ZONE"] } ] }
IAMキーを取得したら、以下の内容でacmesmith.ymlを作成します。YOUR_PASSPHRASE
は鍵のパスフレーズなので適当なものに置き換えてください。
endpoint: https://acme-v01.api.letsencrypt.org/ storage: type: s3 region: ap-northeast-1 bucket: YOUR_BUCKET prefix: cert aws_access_key: access_key_id: IAM_KEY secret_access_key: IAM_SECRET challenge_responders: - route53: aws_access_key: access_key_id: IAM_KEY secret_access_key: IAM_SECRET account_key_passphrase: YOUR_PASSPHRASE1 certificate_key_passphrase: YOUR_PASSPHRASE2
acmesmithはRubyGemsで提供されています。
gem install acmesmith
初期登録と更新
まずは、Let's Encryptのアカウント登録と証明書発行を行います。ドメインの所有者であることの確認(ACME Challenge)はRoute53で行われます。
acmesmith register mailto:example@gmail.com acmesmith authorize example.com acmesmith request example.com acmesmith list
証明書のリストが表示されれば成功です。S3にはLet's Encryptのアカウント鍵、SSL証明書とその秘密鍵が格納されます。
期限切れが近い証明書を更新するには以下を実行します。デフォルトでは期限切れ7日前を過ぎたら更新されます。そうでない場合は何もしないので、何回実行しても大丈夫です。
acmesmith autorenew
鍵や証明書はS3にあるので、IAMキーさえ設定すれば他のサーバでも証明書を取得できます。これもACMEサーバには問い合わせないので、何回実行しても大丈夫です。
acmesmith show-certificate example.com acmesmith show-private-key example.com
Dockerで実行する
すでにWebサーバをDockerで運用している場合、acmesmithもDockerで実行するとよいでしょう。ここではRubyのイメージにacmesmithとacmesmith.ymlを追加します。
# acmesmith/Dockerfile FROM ruby:2 RUN gem install acmesmith ADD acmesmith.yml / ENTRYPOINT ["acmesmith"]
# /docker-compose.yml version: "2" services: acmesmith: build: acmesmith
以下のコマンド群で証明書を生成できます。
docker-compose build acmesmith docker-compose run --rm acmesmith autorenew docker-compose run --rm acmesmith show-certificate example.com > cert.pem docker-compose run --rm acmesmith show-private-key example.com > key.pem
生成された証明書をWebサーバに追加するとHTTPSが利用できるようになります。
証明書を更新する際にはイメージのリビルドとコンテナの再起動が必要になるため、およそ90日ごとに数秒のダウンタイムが発生します*1。
最後に、acmesmithで生成した証明書をnginxで利用する例を公開します。
*1:Let's Encryptの用途を考えると、数秒のダウンタイムを許容できないケースは少ないかと思います。ダウンタイムを許容できない場合はボリューム経由で証明書を渡してシグナルを投げるといった工夫が必要です。
VirtualBoxのグラフィックスコントローラをvmsvgaに変更する
VirtualBoxでゲストOSを実行する場合、通常はVirtualBoxに対応したディスプレイドライバをゲストOSにインストールする必要があります。ゲストOSが特殊で標準のディスプレイドライバしか利用できない場合は低解像度しか利用できませんが、もしゲストOSがVMwareのディスプレイドライバを持っている場合、グラフィックスコントローラをVMware仕様に変更することで高解像度を利用できる可能性があります。
最近のVirtualBoxにはVMware仕様のグラフィックスコントローラも組み込まれており、コマンドラインからVM設定を変更することで利用できます。 VBoxManage
コマンドのヘルプを見ると、以下のように --graphicscontroller
オプションで vmsvga
が選択できることが分かります。
% /Applications/VirtualBox.app/Contents/MacOS/VBoxManage modifyvm Usage: VBoxManage modifyvm <uuid|vmname> ...(中略)... [--graphicscontroller none|vboxvga|vmsvga]
グラフィックスコントローラをVMware仕様に変更するには以下を実行します。
/Applications/VirtualBox.app/Contents/MacOS/VBoxManage modifyvm VM名 --graphicscontroller vmsvga
私の環境では問題なく動作しています。高解像度が出てこない場合はビデオメモリを増やしてみてください。
なお、この機能はGUIからは利用できないようになっています。以下のメーリングリストによるとexperimentalなので正式にはサポートされていないようです。