『AWS CLIを活用: SQSメッセージをRDS (MySQL) に非同期保存する方法』
『AWS CLIを活用: SQSメッセージをRDS (MySQL) に非同期保存する方法』
はじめに
Amazon Simple Queue Service (SQS) は、AWSが提供するフルマネージドなメッセージキューサービスであり、大量のメッセージを効率的に処理するのに適しています。しかし、これらのメッセージを永続的に保存する場面も多々あります。その場合、Amazon RDSのようなデータベースサービスと組み合わせて使用することが考えられます。
この記事では、AWS CLIを使用してSQSとRDS (MySQL) をセットアップし、SQSからメッセージを受信してRDSに保存する手順を実際に歩みながら解説します。特に、VPC内でのリソースのセットアップやセキュリティの観点からの設定にも焦点を当てています。
パラメータ
主要なパラメータ一覧
パラメータ名 | 説明 |
---|---|
VPC_ID |
作成されるVPCのID。 |
SUBNET_ID |
VPC内のサブネットのID。 |
SECURITY_GROUP_ID |
RDSおよびEC2インスタンスのセキュリティグループのID。 |
DB_INSTANCE_IDENTIFIER |
RDSデータベースインスタンスの識別子。 |
DB_SUBNET_GROUP_NAME |
RDSデータベースのサブネットグループの名前。 |
SQS_QUEUE_URL |
作成されるSQSキューのURL。 |
MESSAGE_BODY |
SQSから受信されるメッセージの内容。 |
YOUR_RDS_ENDPOINT |
RDSデータベースインスタンスへのエンドポイント。 |
手順
以下の手順では、まずVPCとその関連リソースをセットアップし、次にRDS (MySQL) インスタンスを作成します。その後、SQSキューを作成し、メッセージを送信・受信する方法、そして受信したメッセージをRDSに保存する方法を説明します。
新しいVPC内にRDSインスタンスを作成
新しいVPC内にRDSインスタンスを作成します。
VPCの作成
VPC_ID=$(aws ec2 create-vpc --cidr-block 10.0.0.0/16 --query 'Vpc.VpcId' --output text)
aws ec2 create-tags --resources $VPC_ID --tags Key=Name,Value=MyNewVPC
VPCのDNS解決を有効にする
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-support "{\"Value\":true}"
VPCのDNSホスト名を有効にする
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-hostnames "{\"Value\":true}"
インターネットゲートウェイの作成
INTERNET_GATEWAY_ID=$(aws ec2 create-internet-gateway --query 'InternetGateway.InternetGatewayId' --output text)
VPCにインターネットゲートウェイをアタッチ
aws ec2 attach-internet-gateway --internet-gateway-id $INTERNET_GATEWAY_ID --vpc-id $VPC_ID
ルートテーブルの更新
ROUTE_TABLE_ID=$(aws ec2 describe-route-tables --filters Name=vpc-id,Values=$VPC_ID --query 'RouteTables[0].RouteTableId' --output text)
次に、ルートテーブルを更新して、トラフィックをインターネットゲートウェイにルーティングします
aws ec2 create-route --route-table-id $ROUTE_TABLE_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $INTERNET_GATEWAY_ID
2つのサブネットを異なるAvailability Zoneに作成
SUBNET_ID_1=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.0.1.0/24 --availability-zone ap-northeast-1a --query 'Subnet.SubnetId' --output text)
aws ec2 create-tags --resources $SUBNET_ID_1 --tags Key=Name,Value=MySubnet1
SUBNET_ID_2=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.0.2.0/24 --availability-zone ap-northeast-1c --query 'Subnet.SubnetId' --output text)
aws ec2 create-tags --resources $SUBNET_ID_2 --tags Key=Name,Value=MySubnet2
セキュリティグループの作成
SECURITY_GROUP_ID=$(aws ec2 create-security-group --group-name MySecurityGroup --description "My security group" --vpc-id $VPC_ID --query 'GroupId' --output text)
aws ec2 create-tags --resources $SECURITY_GROUP_ID --tags Key=Name,Value=MySecurityGroup
# MySQL用のポート(3306)を開放します
aws ec2 authorize-security-group-ingress --group-id $SECURITY_GROUP_ID --protocol tcp --port 3306 --cidr 0.0.0.0/0
パブリックサブネットIDを取得
このサブネットは、RDSと同じVPC内にあり、外部インターネットとの接続が可能でなければなりません。
SUBNET_ID=$(aws ec2 describe-subnets --filters Name=vpc-id,Values=$VPC_ID Name=map-public-ip-on-launch,Values=true --query 'Subnets[0].SubnetId' --output text)
EC2インスタンスの作成
取得したパブリックサブネットIDを使用して、EC2インスタンスを作成します。
INSTANCE_ID=$(aws ec2 run-instances --image-id ami-0c55b159cbfafe1f0 --instance-type t2.micro --subnet-id $SUBNET_ID --security-group-ids $SECURITY_GROUP_ID --key-name YourKeyName --query 'Instances[0].InstanceId' --output text)
注意: 上記のコマンドでは ami-0c55b159cbfafe1f0 というAmazon Machine Image (AMI) を使用していますが、これはAmazon Linux 2のAMIです。また、YourKeyName はEC2インスタンスにSSH接続するためのキーペアの名前です。適切なキーペア名に置き換えてください。
インスタンスの状態が running になるのを待つ
aws ec2 wait instance-running --instance-ids $INSTANCE_ID
インスタンスにタグを追加
aws ec2 create-tags --resources $INSTANCE_ID --tags Key=Name,Value=MyEC2Instance
DBサブネットグループの作成
aws rds create-db-subnet-group --db-subnet-group-name MyDBSubnetGroup --subnet-ids $SUBNET_ID_1 $SUBNET_ID_2 --db-subnet-group-description "My DB subnet group"
RDSインスタンスの作成
aws rds create-db-instance \
--db-name MyDatabase \
--db-instance-identifier MyDBInstance \
--allocated-storage 20 \
--db-instance-class db.t2.micro \
--engine mysql \
--master-username admin \
--master-user-password YourSecurePassword \
--vpc-security-group-ids $SECURITY_GROUP_ID \
--db-subnet-group-name MyDBSubnetGroup
RDSインスタンスの「パブリックアクセス可能」設定を「はい」に変更
aws rds modify-db-instance \
--db-instance-identifier MyDBInstance \
--publicly-accessible \
--apply-immediately
MyDBInstance
は変更したいRDSインスタンスの識別子に置き換えてください。
--apply-immediately
フラグは、変更を即時に適用するためのものです。このフラグを指定しない場合、変更は次のメンテナンスウィンドウで適用されます。
RDSインスタンスのエンドポイントを取得
aws rds describe-db-instances --db-instance-identifier MyDBInstance --query "DBInstances[0].Endpoint.Address" --output text
MyDBInstance
はあなたのRDSインスタンスの識別子に置き換えてください。
このコマンドの出力は、RDSインスタンスのエンドポイントのURLです。
EC2インスタンスからMySQLデータベースに接続
AWS CLIではRDBに入れないので、同じVPC内のパブリックサブネットのEC2インスタンスから接続。
mysql -h YOUR_RDS_ENDPOINT -u admin -pYourSecurePassword
-pYourSecurePassword
はスペースを空けない。
データベースの作成
CREATE DATABASE sqs_messages;
テーブルの作成
USE sqs_messages;
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
message_body TEXT
);
SQS
SQSキューの作成
aws sqs create-queue --queue-name MyQueue
SQSキューにテストメッセージを送信
aws sqs send-message --queue-url YOUR_SQS_QUEUE_URL --message-body "Test message 1"
複数のメッセージを送信
for i in {1..10}; do
aws sqs send-message --queue-url YOUR_SQS_QUEUE_URL --message-body "Test message $i"
done
これで、SQSキューに10個のテストメッセージが送信されます。次に、これらのメッセージを受信してRDS (MySQL) に保存する手順を実行できます。
SQSにメッセージが正常に送信されたかを確認するには、以下のコマンドを実行して、キューの属性を取得します
aws sqs get-queue-attributes --queue-url YOUR_SQS_QUEUE_URL --attribute-names ApproximateNumberOfMessages
このコマンドの出力で ApproximateNumberOfMessages の値を確認することで、キューに溜まっているメッセージの数を知ることができます。
SQSからメッセージを受信
MESSAGE_BODY=$(aws sqs receive-message --queue-url YOUR_SQS_QUEUE_URL --query 'Messages[0].Body' --output text)
YOUR_SQS_QUEUE_URL
は環境に合わせて変更してください。
受信したメッセージをRDSに保存
mysql -h YOUR_RDS_ENDPOINT -u admin -pYourPassword -e "USE sqs_messages; INSERT INTO messages (message_body) VALUES ('$MESSAGE_BODY');"
YOUR_RDS_ENDPOINT
YourSecurePassword
は環境に合わせて変更してください。
messages テーブルに保存されている全てのメッセージを表示
mysql -h YOUR_RDS_ENDPOINT -u admin -pYourPassword -e "USE sqs_messages; SELECT * FROM messages;"
まとめ
AWSのサービスを組み合わせることで、効率的なデータのやり取りと永続化が可能です。この記事を通して、SQSとRDSを連携させる基本的な方法を学びました。今後のアプリケーション開発やシステム設計において、これらのサービスの活用を検討してみてください。
参考
Amazon SQS のチュートリアル - Amazon Simple Queue Service
初心者向け『チュートリアル: Amazon Simple Queue Service で AWS Lambda を使用する』をやってみた | DevelopersIO
S3 イベント通知でSQSとLambdaを経由してSNS送信する構築ハンズオン - 協栄情報ブログ
1.1. SQSキューの作成 (handson-cli-sqs-1st-queue) — ハンズオン(簡易版): SQS入門
Amazon SQS(サーバーレスアプリのためのメッセージキューサービス)| AWS
Discussion