AWS LightsailへのPotatoのデプロイ
potato deployを使い、月額$12でPotatoのアノテーション研究をAWS Lightsailに載せる手順を、認証情報の設定から最後のアノテーションの取得まで説明します。
potato deploy up --provider awsは、アノテーション研究を1台のAWS Lightsail仮想マシンに月額$12の定額で載せ、アノテーターに送るHTTPSアドレスを用意します。アカウントでLightsailが無効になっていない限り、AWSではこのデプロイ先を使ってください。料金にはIPv4アドレスと、再起動しても残る60 GBのディスクが含まれます。Potatoに必要な権限はlightsail:*とsts:GetCallerIdentityだけなので、権限を絞ったIAMロールでも動作します。このページの手順にはPotato 2.10以降と、すでにpotato startで実行したことのある設定が必要です。
AWSの認証情報を設定する
PotatoはAWSの認証情報をawsコマンドラインツールと同じ順序で読み込みます。まずAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEY、次にAWS_PROFILE、最後に~/.aws/credentialsと~/.aws/configです。AWSのextraをインストールし、AWS CLIでサインインして、Potatoが想定どおりのアカウントを認識しているか確認します。
pip install 'potato-annotation[deploy-aws]'
aws configure # or: aws sso login --profile lab
potato deploy providers --verifyproviders --verifyは、認証情報が誰のものかを各プロバイダーに問い合わせ、その答えを表示します。所属機関がシングルサインオンを使っている場合は、すべてのデプロイで--aws-profile labのようにプロファイル名を渡してください。Potatoはそれを記録し、以降のコマンドで同じアカウントを使います。PotatoがAWSの認証情報をディスクに書き込むことはありません。
IAMユーザーやロールの権限が絞られている場合は、管理者にlightsail:*とsts:GetCallerIdentityを依頼してください。ほかの2つのAWSデプロイ先には、これより多くの権限が必要です。EC2のデプロイ先(--provider aws-ec2、月額約$18)はLightsailが無効になっているアカウント向けで、ECS Expressのデプロイ先(--provider aws-ecs)は、再起動するとディスクが消えるコンテナを実行します。
サインインできる人を決める
potato deployはサインインの設定を変更せず、Lightsailのアドレスは公開されています。設定で誰でも登録できるようになっていれば、下のドライランが警告D003「Anyone who finds the URL can register and annotate.」(URLを見つけた人は誰でも登録してアノテーションできます)を表示します。クラウドソーシングの研究では、プラットフォームがワーカーをリンクに送るので、公開登録は通常は意図したとおりの設定です。名前の決まったアノテーターの場合は、デプロイする前に、allow_all_users: falseを設定してuser_config.usersの下に一覧を書くか(パスワード管理)、Google、GitHub、所属機関でサインインしてもらうようにしてください(SSOとOAuth認証)。
計画を確認する
ドライランにはAWSアカウントが必要なく、何も作成しません。事前チェックのレポート、デプロイで行われるすべての手順、費用の見積もりを表示します。
potato deploy up myproject/config.yaml --provider aws --dry-runデフォルトのデプロイでは、計画はus-east-1にタスク名にちなんだ名前のインスタンスを1つ作成し、2 GBのsmall_3_0バンドルとUbuntu 24.04を使います。静的IPを割り当てるので、停止と起動をしてもアドレスとその証明書は変わりません。開くポートは22、80、443だけです。PotatoはCaddyウェブサーバーの背後でポート8000を待ち受けますが、デプロイがポート8000を開くことはありません。Potatoはこのデプロイ専用のSSHデプロイキーを生成し、自分のSSHキーは使いません。
デフォルトを変えるフラグは3つあります。--regionには任意のLightsailリージョンを指定できます。Potatoはアイテムセットをメモリに保持するため、2 GBに収まらないコーパスには--size medium_3_0が必要で、これで月額$24の4 GBになります。--volume-gbは1 GBあたり月額$0.10の別のLightsailディスクを追加し、タスクのデータをそこに置きます。
デプロイする
同じコマンドを--dry-runなしで実行します。Potatoは計画をもう一度表示し、確認を待ちます。
potato deploy up myproject/config.yaml --provider awsインスタンスが起動してDockerをインストールする間、デプロイには数分かかります。最後に、静的IP上のhttps://アドレスであるURLと、設定の隣にある管理者キーファイル.potato/secrets.jsonのパスが表示されます。管理者キーで/adminの管理者ダッシュボードを開けます。設定を編集した後にもう一度upを実行すると、新しいバージョンがアップロードされ、同じインスタンス上でタスクが再起動します。
ドメイン名がない場合、Let's EncryptはIPアドレスに対して証明書を発行します。有効期間は約6日で、自動で更新されます。更新に失敗するとpotato deploy status myproject/config.yamlが報告するので、研究を無人で運用する場合は数日おきに確認してください。自分のドメインを使うには、DNSのAレコードを静的IPに向け、--domain annotate.example.eduを付けて再デプロイします。
研究を終える
アノテーションはインスタンスのディスク上にあり、このディスクはサーバーやマシンを再起動しても残りますが、destroyでは残りません。先に自分のマシンにpullして内容を確認し、それからインスタンスを削除してください。
potato deploy pull myproject/config.yaml
potato deploy destroy myproject/config.yamlpullはデプロイが収集したものをすべて新しいpotato-pull-<name>-<timestamp>ディレクトリに書き出し、データベースはSQLiteのバックアップコマンドでコピーします。destroyは一度もpullされていないデプロイでは実行されません。削除の際には静的IPも解放されます。インスタンスに割り当てられていない静的IPにもLightsailは課金するためです。--volume-gbを使った場合は、destroy --keep-dataで別のディスクを残せます。
トラブルシューティング
**「AWS rejected the credentials」**は、SSOのセッションが期限切れになったか、AWS_PROFILEが存在しないプロファイルを指していることを意味します。aws sso loginを実行してから、もう一度デプロイしてください。
**「Lightsail does not sell bundle …」**は、価格改定に伴ってAWSがバンドル名を変更したときに表示されます。エラーには現在販売中のバンドルが列挙されるので、そのうちの1つを--sizeに指定してください。
最初の数分間はHTTPSが失敗します。 証明書はインスタンスに到達できるようになってから要求されるためです。potato deploy statusは、証明書のエラーをサーバーの停止とは区別して報告します。
関連
- Potatoをローカルまたはクラウドで実行する:ほかのクラウドデプロイ先とバックアップのフラグ
- アノテーションサーバーのデプロイ:ホストの選び方
- AWSデプロイのリファレンス:AWSの各デプロイ先に必要なIAMアクションの一覧