🐥

『AWS CLIを活用: SQSメッセージをRDS (MySQL) に非同期保存する方法』

2023/08/06に公開

『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

[AWS入門]Amazon SQS触ってみた

初心者向け『チュートリアル: Amazon Simple Queue Service で AWS Lambda を使用する』をやってみた | DevelopersIO

S3 イベント通知でSQSとLambdaを経由してSNS送信する構築ハンズオン - 協栄情報ブログ

1.1. SQSキューの作成 (handson-cli-sqs-1st-queue) — ハンズオン(簡易版): SQS入門

Amazon SQS(サーバーレスアプリのためのメッセージキューサービス)| AWS

sqs — AWS CLI 1.29.20 Command Reference

ハンズオン(簡易版): SQS入門 — ハンズオン(簡易版): SQS入門

Discussion