AWS Fargate の Amazon Elastic Container Service (Amazon ECS) タスクからデータベースに接続したいと考えています。
解決策
前提条件:
注: 次の解決策では MySQL データベースエンジンを使用しています。他のエンジンタイプを使用するデータベースに接続する方法の詳細については、「Amazon RDS のスタート方法」を参照してください。
タスクをデータベースに接続する
次の手順を実行します。
-
MySQL データベースに接続する Python スクリプトを作成します。次の rds.py サンプルスクリプトでは、データベースへの接続の結果を Amazon CloudWatch に送信します。
import pymysql
import os
DATABASE_ENDPOINT = os.environ['example_endpoint']
USERNAME = os.environ['example_username']
PASSWORD = os.environ['example_password']
try:
print("Connecting to " + DATABASE_ENDPOINT)
db = pymysql.connect(host=DATABASE_ENDPOINT, user=USERNAME, password=PASSWORD)
print("Connection successful to " + DATABASE_ENDPOINT)
db.close()
except Exception as e:
print("Connection unsuccessful due to " + str(e))
注: example_endpoint を実際のデータベースのエンドポイントに置き換えてください。example_username をユーザー名に置き換えてください。**example_password ** を実際のパスワードに置き換えてください。
-
イメージを組み立てるために、必要なコマンドを含む Dockerfile を作成します。次のサンプルファイルには、必要なコマンドが含まれています。
FROM python
RUN pip install pymysql cryptography
COPY rds.py /
CMD [ "python", "/rds.py" ]
-
Amazon Elastic Container Registry (Amazon ECR) リポジトリを作成し、そのリポジトリに Docker イメージをプッシュします。
-
タスク定義を作成し、その後に Docker イメージをコンテナイメージとして追加します。
{ "executionRoleArn": "arn:aws:iam::example_account_ID:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "example_app",
"image": "example_repository_URL",
"essential": true
}
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"family": "example_app"
}
注: example_account_ID を、お使いの AWS アカウント ID に置き換えてください。**example_app ** をアプリケーションの名前に置き換えてください。example_repository_URL を Amazon ECR リポジトリの URL に置き換えてください。タスク定義で ENDPOINT、USER、および PASS 環境変数の値を設定するのがベストプラクティスです。これらの値は、環境変数として直接渡すか、AWS Secrets Manager のシークレットから取得できます。詳細については、「Amazon ECS タスクにおいて、シークレットや機密情報をコンテナに安全に渡す方法を教えてください」を参照してください。
-
Amazon ECS コンソールを開きます。
-
ナビゲーションペインで、[タスク定義] をクリックします。
-
タスク定義を選択し、[アクション]、[タスクの実行] の順にクリックします。
-
[起動タイプ] で [FARGATE] を選択します。
-
[クラスター] で、タスク定義用のクラスタを選択します。
-
[タスクの数] に、実行するタスクの数を入力します。
-
[VPC とセキュリティグループ] セクションの [クラスター VPC] で、Amazon Virtual Private Cloud (Amazon VPC) を選択します。
-
[サブネット] で、サブネットを選択します。
-
[セキュリティグループ] で、少なくとも 1 つのセキュリティグループを選択します。
-
[タスクの実行] をクリックします。
タスクがデータベースに接続されると、rds.py スクリプトはタスクを停止し、次のメッセージを表示します。
"Essential container in task exited."
タスクがデータベースに接続されたことを確認する
次の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで [クラスター] をクリックしてから、クラスターを選択します。
- [タスク] タブをクリックします。
- [必要なタスクのステータス] で、停止したタスクのリストを表示するために、[停止] を選択します。
- 停止したタスクを選択します。
- 停止したタスクの [詳細] タブの [コンテナ] セクションを展開します。
- [CloudWatch でログを表示] をクリックします。
タスクをデータベースに正常に接続すると、CloudWatch コンソールに次のメッセージが表示されます。
"Connection successful to [your endpoint]"