めもです。随時追記
TODO
- エラーの時の動作
- VPC等の設定
- 監視周り
つくりたいもの
- ElasticBeanstarkのWorker Tierで定期的にメール送信するバッチ
- PlatformはDockerMultiContainer
- Cronでx分に一回送信するメールあるかチェックして送信する
ざっくり
- EBのWorkerはSQSのキューをEC2で監視してる
- キューにPublishされたら監視Jobはlocalhostの80にHTTP/POSTする
- WEBAPI作って処理すりゃいい
- HTTP/POSTの実態はApache/httpdらしいのでデフォTimeoutは5分
- 処理が長時間かかることが予想される場合は、Timeoutを延長するか,いったん200で返して、バックグラウンドで処理する
- 200返すとキューから消えるので別途ステート管理が必要
- EBはECSやらLBとか一括で設定できるアプリケーションプラットフォーム?でいいのかな
構築
aws-ebcliの導入
- https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html#eb-cli3-install.scripts
- pipでインストール。要aws-cli設定
アプリケーション作成+環境作成
-
eb init
でアプリケーションを作る(プラットフォームはDocker Multi Container) - ecr作ってAPIをPush
- aws-elasticbeanstalk-ec2-roleにECRのPullポリシーつける
-
Dockerrun.aws.json
書く - Cron.yaml書く
- よくわかんないけど要Commit????
-
eb create ${env-name} -t worker
でWorker環境作成 - Deployまでいくはず、ダッシュボードからSQSに飛んでメッセージ送信してみる
- LogからAPIのLog確認して200で処理されてるの確認
dockerrun.aws.json
- MultiContainerPlatformだけど確認だけなのでコンテナ1個
- イメージ的にDockerComposeのJSON版
-
"AWSEBDockerrunVersion": 2
はMultiContainer専用っぽい - imageにECRのURI
.json
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [
{
"name": "python-caintainer",
"image": "xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/eb-worker-demo:latest",
"essential": true,
"memory": 256,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80
}
],
"workingDirectory": "/var/app",
"environment": [],
"entryPoint": ["python", "app.py"]
}
]
}
定期Job
- cron.yamlで設定する(プロジェクトルートにおいときゃいい?)
- urlに対応してPOSTされる
- cron式通りにSQSがPusblishされる
.yaml
version: 1
cron:
- name: "batch_task_1"
url: "/api/v1/sendmail"
schedule: "*/30 * * * *"
- name: "batch_task_2"
url: "/api/v1/status"
schedule: "*/5 * * * *"