WSGI(Web Server Gateway Interface)とは

  • WSGI(Web Server Gateway Interface)とは
    • WebサーバーとWebアプリケーションをつなぐ共通のインターフェース
  • どうしてWSGIが必要になったか
    • WebサーバーによってWebアプリケーションフレームワークが利用できなかったり制限が起きる問題を解決するため
  • WSGIのメリット
    • WebサーバとWebアプリケーションの実装を切り離すことができ,WebサーバとWebアプリケーションフレームワークの組み合わせを柔軟に選択することができる

参考

ERROR: Named volume "data:/var/lib/mysql:rw" is used in service "xxxx" but no declaration was found in the volumes section.

トップレベルにもvolumesを指定しないとだめ。

version: "3"

services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data

volumes:
  data-volume:

参考

Compose file version 3 reference | Docker Documentation

特定のIP、ユーザからはrootでのアクセスを許可する

特定のIPアドレス、ユーザからのアクセスの場合のみrootでのアクセスを許可する。

PasswordAuthentication no
PermitRootLogin no

Match Address 192.168.1.1/32
    PermitRootLogin without-password
    
Match User hoge
    PermitRootLogin without-password

Matchの引数で利用可能なもの

  • User(ユーザ名)
  • Group(グループ名)
  • Host(ホスト名)
  • LocalAddress(ローカルアドレス)
  • LocalPort(ローカルポート)
  • Address(アドレス)

参考

SSHD_CONFIG (5)

serverless framework で AWS lambdaのデプロイをする

主に利用方法のメモです。

前提

  • nodeはインストール済み
  • AWSの権限は設定済み

インストール

serverlessコマンドのエイリアスとしてslsコマンドが登録される。

$ npm install -g serverless
$ sls -v
1.30.0

新規サービスの作成

ここではpython3のテンプレートから作成する。利用できるテンプレートはsls create -hで確認できる。

$ sls create -t aws-python3 -p sample-app
$ cd sample-app
$ tree -L 1
.
├── handler.py # lambdaファンクションのテンプレート
└── serverless.yml # serverlessの設定ファイル

プラグイン機能

serverlessにはプラグイン機能が準備されている。

プラグインの検索

pythonプラグインを検索する。

$ sls plugin search --query python

プラグインのインストール

serverless-python-requirementsをインストールする。serverless-python-requirementsはrequirements.txtに記載されたモジュールをデプロイ時にまとめてパッケージ化してくれるプラグイン

$ sls plugin install -n serverless-python-requirements

サービスのデプロイ

プロファイルを指定する場合は--aws-profileオプションで、ステージを指定する場合は--stageオプションで行う。

$ sls deploy --aws-profile profile_file --stage prod

serverlessの設定

基本的な設定はドキュメントを参照。自身が運用するにあたってハマりどころだけ記載する。

既存のroleを指定する

既存のロールの権限を与えたい場合は、roleキーにIAMロールのarnを指定する。

provider:
  name: aws
  runtime: python3.6
  stage: ${opt:stage, 'dev'}
  region: ap-northeast-1
  role: arn:aws:iam::xxxxxxxxxx:role/lambda-role
  ...

stage毎に環境変数を変える

各ステージ用の設定ファイル作成

$ mkdir conf && cd conf
$ touch dev.yml, prod.yml 
$ vi dev.yml
DYNAMODB_TABLE: 'dev_dynamo_table'
# 本番用も同じように

serverlessの設定

stage毎の設定ファイルを読み込ませ、環境変数の設定で指定したstageの値をセットする。 devを指定した場合はdev.yml、prodを指定した場合はprod.ymlのDYNAMODB_TABLEの値がセットされることになる。

functions:
  speech-translation:
    handler: handler.handler
    events:
      - schedule: rate(30 minutes)
    environment:
      DYNAMODB_TABLE: ${self:custom.otherfile.environment.${self:provider.stage}.DYNAMODB_TABLE}

custom:
  otherfile:
    environment:
      dev: ${file(./conf/dev.yml)}
      prod: ${file(./conf/prod.yml)}

共通の環境変数を設定する

provider.environmentに指定する。

provider:
  ... 省略
  environment:
    DYNAMODB_ENDPOINT: 'https://dynamodb.ap-northeast-1.amazonaws.com'

注意事項

serverlessでデプロイした場合、タイムアウトが6秒に設定される。時間がかかる処理をする場合は変更する必要がある。

参考

Error: Could not locate Flask application. You did not provide the FLASK_APP environment variable.

英文そのまま。環境変数FLASK_APPを設定する。

export FLASK_APP=application.py
flask run

DynamoDB ローカルのDockerをつくった

Vagrantに入れてたDynamoDB ローカルをDockerに移行した。

from openjdk:8-jre

RUN mkdir /usr/local/dynamodb
RUN curl https://s3-ap-northeast-1.amazonaws.com/dynamodb-local-tokyo/dynamodb_local_latest.tar.gz | tar zx -C /usr/local/dynamodb
WORKDIR /usr/local/dynamodb

ENTRYPOINT ["java",  "-Djava.library.path=./DynamoDBLocal_lib",  "-jar",  "DynamoDBLocal.jar"]
EXPOSE 8000

build

タグ名は適宜変更する。

docker build -t grmn/dynamodb-local <path_to_dockerfile>

run

docker run -itd -p 8000:8000 --rm grmn/dynamodb-local

github.com