AWS Exec を利用してスクリプトを実行する方法
これはなに?
AWS ESC 上で実行されているバックエンドサーバーアプリケーションのコンテナに入り込み、スクリプト(ex. マイグレーションバッチ)を実行する方法を説明しています。
具体的な例として、以下のような利用用途を想定しています:
- DB のスキーマ変更に伴うバッチスクリプトを実行したい
- 仕様変更に伴う既存データの強制変更
1. aws cli の初期設定をする
aws cli で認証情報を管理する方法はいくつかありますが、原則として「AWS SSO(シングルサインオン)による一時認証を利用する方法」で管理していきたいと思います。IAM ユーザーの key/secret を平文で config ファイル上に管理するプラクティスはアンチパターンなので、絶対に行わないでください。
IMPORTANT
SSO による認証を利用するためには、SSO アカウントが発行されている必要があります。アカウントが無い、パスワードを忘れたなどは @Yuki Ota に連絡してください!
前提条件として、まず aws cli v2 がインストールされていることを確認してください。
$ aws --version
aws-cli/2.2.31aws cli v2 がインストールされていない場合は、下記を参考にインストールしてください。 (インストーラーを使うのがラクです)
aws cli v2 が利用可能であることを確認したら、次にターミナルから AWS SSO の一次認証情報を設定する方法を説明します。以下のコマンドを実行して、プロセスに従って認証してください。
# SSO 認証プロセスを開始する
$ aws configure sso
SSO session name (Recommended): xxx # ← 分かりやすい適当な値を指定する
SSO start URL [None]: https://zipunk.awsapps.com/start # ← 入力する
SSO Region [None]: ap-northeast-1 # ← 東京リージョンを指定する
SSO registration scopes [sso:account:access]: # ← 何も入力せずEnterでOK
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:
# 自動的にブラウザに遷移し、下記の Fig 1, Fig 2 のようにプロセスを踏む
https://device.sso.ap-northeast-1.amazonaws.com/
Then enter the code:
RKGH-JFRS # ← ブラウザ上での認証が終了すれば、自動的に入力される
There are 2 AWS accounts available to you.
Using the account ID 225473402681 # ← SSO に紐付いているアカウントがプルダウンで選択できるので、設定したいプロファイルを選択する
The only role available to you is: AdministratorAccess
Using the role name "AdministratorAccess"
CLI default client Region [None]: ap-northeast-1 # ← 改めて入力する
CLI default output format [None]: json # ← json を指定する
CLI profile name [AdministratorAccess-225473402681]: quden-dev # profile 名になるので、わかりやすい名前を入力する
To use this profile, specify the profile name using --profile, as shown:
aws s3 ls --profile quden-dev # ← このメッセージが出れば OK上記の設定が完了すると、下記のように、aws cli を使うことができます。
$ aws s3 ls --profile quden-dev
2021-08-04 21:26:17 toruca-dev-media-bucket
2021-04-02 23:33:00 toruca-dev-videos-bucket
# ...
# それ以外にもバケットが出てきます▼ Fig 1. Authorize request

▼ Fig 2. Request approved

sessionが切れている場合は以下のコマンドで再ログインしてください。
aws sso login --profile quden-dev2. ESC 上のコンテナにアクセスする
aws cli の設定が終わっていれば、下記のコマンドを実行できます。各種変数の簡単な説明は下記のとおりです。
PROFILE_NAME: AWS プロファイル名- ex:
quden-dev
- ex:
CLUSTER_NAME: クラスター名- 開発環境 →
toruca-dev-core - 本番環境 →
quden-prod-core
- 開発環境 →
TASK_ID: クラスター上で実行されているタスクの ID。デプロイのたびに変更されます。- ex:
20972456c96847c59da05fe6678bbe45 - 本番環境はタスクが複数実行されています。どれか1つを選択してください。
aws ecs list-tasks --profile <PROFILE_NAME> --cluster <CLUSTER_NAME>で task id を確認できます。
- ex:
# コンテナ内に入るコマンド
# dev
aws ecs execute-command \
--region ap-northeast-1 \
--container core-container \
--command "sh" \
--interactive \
--profile quden-dev \
--cluster toruca-dev-core \
--task <TASK_ID>
# prod
aws ecs execute-command \
--region ap-northeast-1 \
--container core-container \
--command "sh" \
--interactive \
--profile quden-prod \
--cluster quden-prod-core \
--task <TASK_ID>コマンドが成功すると以下のようなメッセージが表示され、セッションが開始します。
Starting session with SessionId: ecs-execute-command-02ab5e8fb5228faef
This session is encrypted using AWS KMS.
/opt/app #
# 以降コマンドを実行できるSessionManagerPlugin がない場合、エラーになるので、こちらを参考にインストール
3. スクリプトを実行する
MongoDB の接続先情報などは環境変数として既にコンテナ内に設定されているので、基本的にスクリプトを実行するだけで DB に変更を加えることができます。
# 実行コマンド
yarn run:ts-node <path-to-script> [--dry-run | --exec]
# 例: dry run モードでスクリプトを実行する
yarn run:ts-node ./scripts/batch/20210819-update-mailNotifcation.ts --dry-runローカルでテストを行う場合は、起動している docker container に sh で入り込んで、コマンドを実行することでテストできます。
# docker container の sh を起動する
docker exec -it <container-id> sh
# コマンド実行例
# WARN: `dev:run:ts-node` であることに注意!!
yarn dev:run:ts-node ./scripts/batch/20210819-update-mailNotifcation.ts --dry-runWARNING
<path-to-script>はフルパス、もしくはpackage.jsonからの相対パスを指定する必要があります- 言わずもがなですが、本番環境のコンテナ内にアクセスする場合は細心の注意を払ってください
トラブルシューティング
execute-command実行時に`Error creating new aws sdk session profile "quden-dev" is configured to use SSO but is missing required configuration: sso_region, sso_start_url`とエラーになる
以下の手順を実行してみてください。現象解決時のslackは[こちら](https://zipunk.slack.com/archives/C01MU5GQXSL/p1683597207590589?thread_ts=1683590397.460539&cid=C01MU5GQXSL)~/.aws/configのprofileにあるsso_sessionを消す- profileにsso-sessionに設定されているsso_regionとsso_start_urlを追加する
変更例:
# before
[profile quden-prod]
sso_session = quden-prod
sso_account_id = XXXXXXXXXX
sso_role_name = AdministratorAccess
region = ap-northeast-1
output = json
[sso-session quden-prod]
sso_start_url = https://zipunk.awsapps.com/start
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access
# after
[profile quden-prod]
sso_account_id = XXXXXXXXXX
sso_role_name = AdministratorAccess
region = ap-northeast-1
output = json
sso_start_url = https://zipunk.awsapps.com/start
sso_region = ap-northeast-1