コンテンツにスキップ

pocket.toml

デプロイに関する設定は、pocket.tomlに記述します。

今後利用する名称について

各デプロイ環境をステージと呼びます。これらは、pocket.tomlを通じて、明示的な事前設定が必要です。

別形式のデータ利用やソースを編集する場合

pocket.tomlの内容は、pocket.settings.Settingsとpocket.general_settings.GeneralSettingsに読み込まれます。 これらの項目は自由に編集でき、これらを用意できれば、他の機能から見ても問題ありません。

システムは、これらのSettingsを元にContextを作成します。 こちらは、システムが使うために存在するデータでなので、これらのデータを直接編集してしまうと、正常に動作しなくなる可能性が高いです。

このcontextは、contextlibやpydanticのcontextとは異なります。 ややこしいので、名称を変えるかもしれません。 このcontext自体を消すこともありえます。

general settings

デプロイ環境に依存しない設定を記述します。

region: str
(required) デプロイ環境のリージョンを指定します。
stages: list[str]
(required) ステージのリストを指定します。
namespace: str = "pocket"
作成されるリソースの名前空間として、幅広く利用されます。

general.django_fallback

ローカル環境で利用する、Djangoのsettings.pyに設定する内容を記述します。 設定内容は、awscontainer.djangoと同じです。

詳しくはDjango設定を参照してください。

stage settings

デプロ環境毎の設定を記述します。

ステージ毎の設定

pocket.tomlで設定された設定は、基本的に全てのステージに適用されます。 そのため、[neon]という記述をすると、全てのステージでneonが作られます。

ステージ毎に別の設定を行いたい場合は、ステージ名を最初に記述し、その下に設定を記述します。 例えば、[dev.neon]という記述をすると、devステージのみneonが作られます。

s3

S3バケットの設定を記述します。

# 最小設定
[s3]
bucket_name_format: str = "{stage}-{project}-{namespace}"

バケット名のフォーマットを指定します。 デプロイ環境では、この名称のS3を利用しようとします。

{namespace}は、general_settingsnamespaceで指定した文字列に置き換えられます。 {stage}は、ステージ名に、{project}はプロジェクト名に置き換えられます。

大量にステージを作成する場合、{project}-{namespace}などと{stage}を削除する事で、バケットが増えすぎるのを防ぐことができます。 以下は、prodステージのみバケットを分ける例です。

[s3]
bucket_name_format = "{project}-{namespace}"
[prod.s3]
bucket_name_format = "{stage}-{project}-{namespace}"

neon

Neonの設定を記述します。

# 最小設定
[neon]

オプションはありません。

awscontainer

AWS Lambdaの設定を記述します。

# 最小設定
[awscontainer]
dockerfile_path = "pocket.Dockerfile"
dockerfile_path: str
(required) Lambdaで利用するDockerfileのパスを指定します。

awscontainer.handlers

Lambdaで利用するハンドラーの設定を記述します。 基本的には、以下の設定で、wsgiとmanagementコマンドを有効にする想定です。

# wsgiとmanagementのhandlersを作成
[awscontainer.handlers.wsgi]
command = "pocket.django.lambda_handlers.wsgi_handler"
[awscontainer.handlers.management]
command = "pocket.django.lambda_handlers.management_command_handler"
timeout = 600

awscotainer.handlers.handler_name.apigateway

API Gatewayの設定を記述します。domain設定をする場合、環境毎の切り分けが必要になります。

# devではAPI Gatewayデフォルトのurl、prodではexample.comを利用します。
[dev.awscontainer.handlers.wsgi]
apigateway = {}
[prod.awscontainer.handlers.wsgi]
apigateway = { domain = "example.com" }

awscontainer.secretsmanager

Lambdaで利用するAWS Secrets Managerの設定を記述します。

pocket_secrets: dict[str, PocketSecretSpec]

magic-pocketのSecrets自動生成機能を利用します。 keyに設定したい環境変数名を、valueには、typeとtype毎のオプションからなる生成ルールを記述します。 デプロイ先でpocket.django.runtime.set_envs()を呼ぶことで、環境変数に登録します。

type = "password"

パスワードを生成します。利用可能なオプションは以下の通りです。

length: int = 16
パスワードの長さを指定します。
# 50文字のパスワードを生成
[awscontainer.secretsmanager.pocket_secrets]
SECRET_KEY = { type = "password", options = { length = 50 } }

type = "neon_database_url"

Neonのデータベース接続用URLをNoneのAPI経由で取得してSecretsManagerに保存します。オプションはありません。

# Neonのデータベース接続用URLを取得
[awscontainer.secretsmanager.pocket_secrets]
DATABASE_URL = { type = "neon_database_url" }

type = "rsa_pem_base64"

RSAの秘密鍵と公開鍵を生成して、base64形式で保存します。 この値は、2つの環境変数に分けて登録され、そのためのsuffix指定は必須オプションです。 必須のオプションは以下の通りです。

pem_base64_environ_suffix: str
(required) PEMキーのbase64形式を保存する環境変数名のsuffixを指定します。
pub_base64_environ_suffix: str
(required) 公開鍵のbase64形式を保存する環境変数名のsuffixを指定します。
# JWT用のRSAキーを生成し、PEMキーを環境変数`JWT_RSA_PEM_BASE64`、公開鍵を環境変数`JWT_RSA_PUB_BASE64`に保存
[awscontainer.secretsmanager.pocket_secrets.JWT_RSA]
type = "rsa_pem_base64"
options = { pem_base64_environ_suffix = "_PEM_BASE64", pub_base64_environ_suffix = "_PUB_BASE64" }

awscontainer.django

Lambda環境で利用する、Djangoのsettings.pyに設定する内容を記述します。 設定内容は、general.django_fallbackと同じです。

詳しくはDjango設定を参照してください。

spa

SPAのためのクラウドフロントとコンテンツアップロード先のバケットを作成します。

どこまでやるのか?

この機能は、SPA配信の外側を作ります。 証明書、DNS設定、クラウドフロント設定、リダイレクト設定、コンテンツ保存用のバケット作成、などです。

SPAのビルド、バケットへのアップロード、キャッシュの設定は別途必要です。 javascript側では、s3-spa-uploadを利用する想定です。

Djangoとは関係ないのでは?

直接は関係ありません。 切り分けとしては、javascript側に有る方が自然です。

ただ、javascriptのデプロイとなると、javascript側にもサーバーが必要になるケースとの混乱が発生します。 magic-pocketのユーザーは、javascriptのコンピューティング環境は持ちたくないケースが多いと思います。 その場合、この機能を使えば、SPA配信用のS3バケットを作るだけという安心があります。

# devとprodがある場合の最小設定
[dev.spa]
domain = "dev.example.com"
[prod.spa]
domain = "www.example.com"
# prod以外は同じバケットを利用する設定
[spa]
bucket_name_format = "{project}-{namespace}-spa"
[prod.spa]
bucket_name_format = "{stage}-{project}-{namespace}-spa"
# prodデプロイ時に、example.comからwww.example.comのリダイレクトを追加する設定
[prod.spa]
redirect_from = [{ domain = "example.com" }]
domain: str
(required) SPAのドメインを指定します。
bucket_name_format: str = "{stage}-{project}-{namespace}-spa"

バケット名のフォーマットを指定します。 デプロイ環境では、この名称のS3を利用しようとします。

{namespace}は、general_settingsnamespaceで指定した文字列に置き換えられます。 {stage}は、ステージ名に、{project}はプロジェクト名に置き換えられます。

origin_path_format: str = "/{stage}"

Changed in 0.2.0

デフォルト値が変更されました。Changelogを参照してください。

オリジンパスのフォーマットを指定します。外部から見える値ではありません。値を設定する場合は、"/"から始まる必要があります。
redirect_from: list[str]
リダイレクトするドメインをリスト形式で指定します。

フォーマットに関する制限

bucket_name_formatorigin_path_formatのどちらかに、{stage}{project}が入っている必要があります。 これは、意図せずアップロード先が重複するのを防ぐためです。

django設定

general.django_fallbackとawscontainer.djangoで設定可能な項目を記述します。 以下の例では、Lambda側で利用する設定を記述しています。

awscontainer.django.storages: dict[str, DjangoStorage]

DjangoのSTORAGESに設定する内容を記述します。 keyは、STORAGESのkeyを指定し、valueには辞書形式データ(DjangoStorage)を指定します。

# 一般的な最小設定
# [s3]設定で作ったバケットの`media`と`static`のディレクトリを利用
[awscontainer.django.storages]
default = { store = "s3", location = "media" }
staticfiles = { store = "s3", location = "static", static = true, manifest = true }

DjangoStorage

store: Literal["s3", "filesystem"]
(required) ストレージの種類を指定します。
location: str
(required for s3) ファイルの保存先を指定します。
static: bool = False
StaticFileのストレージを利用します。
manifest: bool = False
(only for static=True) マニフェストファイルを利用します。
options: dict[str, Any] = {}
その他のオプションを指定します。このオプションは全て、Djangoのstorages[key]["OPTIONS"]にそのまま渡されます。

store, static, manifestは、djangoのStorageクラスを選択するための設定です。 以下6種のストレージから適切なものが選択されます。

  • storages.backends.s3boto3.S3ManifestStaticStorage
  • storages.backends.s3boto3.S3StaticStorage
  • storages.backends.s3boto3.S3Boto3Storage
  • django.contrib.staticfiles.storage.ManifestStaticFilesStorage
  • django.contrib.staticfiles.storage.StaticFilesStorage
  • django.core.files.storage.FileSystemStorage

awscontainer.django.caches: dict[str, DjangoCache]

DjangoのCACHESに設定する内容を記述します。 keyは、CACHESのkeyを指定し、valueには辞書形式データ(DjangoCache)を指定します。

# 最小設定
[awscontainer.django.caches]
default = { store = "locmem" }
store: Literal["locmem"]
(required) キャッシュの種類を指定します。
他のキャッシュバックエンドは?

まだ正式なサポートはありません。 今後、VPCとEFSをサポート予定です。

awscontainer.django.settings

環境毎にtoml形式でsettingsを指定します。 この値は、pocket.django.runtime.get_django_settingsを利用して取得したうえで、settigsの変数に登録する必要があります。

# prodとdevのLambda環境で別のDEFAULT_FROM_EMAILを設定
[dev.awscontainer.django.settings]
DEFAULT_FROM_EMAIL = '"Dev Version" <test@example.com>'
[prod.awscontainer.django.settings]
DEFAULT_FROM_EMAIL = '"Magic Pocket" <test@example.com>'
# 上記のDEFAULT_FROM_EMAILをsettings.pyに登録する例
from pocket.django.runtime import get_django_settings
vars().update(get_django_settings())