やること
serverless frameworkを利用してmysqlを構築できるようにします。 aws自体の学習を含む内容となります。(VPCの構築) 主にcloudformationをserverless frameworkにより作成している形になります。
実装
流れ
VPC環境を構築し、そこにDBインスタンスを追加していく形になります。
- VPCの作成
- ルートテーブルの作成
- インターネットゲートウェイの作成
- インターネットゲートウェイをVPCに接続
- ルートの設定
- サブネットの作成
- セキュリティグループの作成
- インバウンドルールを設定
- DBサブネットグループを作成
- DBインスタンスを作成
以下 Resources
内に追加する内容となります。
1. VPCの作成
VPCの本体を作成します。
VPC: Type: AWS::EC2::VPC DeletionPolicy: Delete Properties: CidrBlock: 10.0.0.0/16 # 任意 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: serverless-rds # 任意
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html
2. ルートテーブルの作成
VPC内部の通信経路の設定に基板のルートテーブルを作成
RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: serverless-rds-public-route-table # 任意
3. インターネットゲートウェイの作成
VPCとインターネットの通信を可能とするためのインターネットゲートウェイを作成 (ここでは作成のみを行いどのリソースとも接続がされていない)
InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: serverless-rds-igw
4. インターネットゲートウェイをVPCに接続
3で作成したインターネットゲートウェイをVPCに接続し、外部とVPCの接続経路を確立
VPCGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC InternetGatewayId: !Ref InternetGateway
5. ルートの設定
2・3で作成したルートテーブルとインターネットゲートウェイを紐付けて、サブネットの接続する経路を作成する。
Route: Type: AWS::EC2::Route Properties: RouteTableId: !Ref RouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway
6. サブネットの作成
DBインスタンスを作成するにはサブネットが2以上必要なので2つのサブネットを作成する。 また2で作成し、5で設定を行ったルートテーブルと紐付けて通信経路を確立する。
PublicSubnetA: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.64.0/20 # 任意 AvailabilityZone: us-east-1a # 任意 Tags: - Key: Name Value: serverless-rds-public-subnet-a # 任意 SubnetRouteTableAssociationPublicSubnetA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref RouteTable SubnetId: !Ref PublicSubnetA PublicSubnetB: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.80.0/20 # 任意 AvailabilityZone: us-east-1b # 任意 Tags: - Key: Name Value: serverless-rds-public-subnet-b # 任意 SubnetRouteTableAssociationPublicSubnetB: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref RouteTable SubnetId: !Ref PublicSubnetB
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html
7. セキュリティグループの作成
リソースへのアクセスを制限するためのセキュリティグループを作成する。
SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupName: serverless-rds # 任意 GroupDescription: Security Group for serverless-rds # 任意 VpcId: !Ref VPC
8. インバウンドルールを設定
10で作成するMySQLへのアクセス設定を追加する。
SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: IpProtocol: tcp CidrIp: <任意のIPアドレス> # 接続を許可するIPを設定 GroupId: !GetAtt SecurityGroup.GroupId ToPort: 3306 # fromとtoでどこからどこまでの範囲のポートを解放するのかを設定する FromPort: 3306
9. DBサブネットグループを作成
DBサーバーを作成する際に割り当てるIPアドレスの範囲の設定 6で作成したサブネットを使用する。 2つ以上のサブネットが必要
DBSubnetGroup: Type: AWS::RDS::DBSubnetGroup Properties: DBSubnetGroupName: serverless-rds-db-subnetgroup # 任意 DBSubnetGroupDescription: "serverless-rds subnet" # 任意 SubnetIds: - !GetAtt PublicSubnetA.SubnetId - !GetAtt PublicSubnetB.SubnetId
10. DBインスタンスを作成
RDS上にDBインスタンスを作成する。 詳細はコード上にコメントで表示。 内部を書き換えることにより、mysql以外のDBエンジンでの作成も可能です。
DBInstance: Type: AWS::RDS::DBInstance Properties: AllocatedStorage: "20" # ストレージの容量 AvailabilityZone: !GetAtt PublicSubnetA.AvailabilityZone # インスタンスを作成するアベイラビリティゾーン BackupRetentionPeriod: 7 # 自動バックアップが保持される日数 CopyTagsToSnapshot: true # スナップショットにタグをコピーする DBInstanceClass: db.t2.micro # メモリ容量 DBInstanceIdentifier: serverless-rdb-db-instance # インスタンス名 DBName: mydb # 初回に自動で作成するdatabase名 必須ではない DBSubnetGroupName: !Ref DBSubnetGroup Engine: MySQL # DBエンジンの設定 postgres aurora など MasterUsername: admin # mysqlのユーザー名 MasterUserPassword: # mysqlのパスワード MaxAllocatedStorage: 1000 # ストレージのオートスケーリングの最大値 Port: "3306" # 接続を受け入れるポート PubliclyAccessible: true # ネットからの接続を可能にする # StorageEncrypted: true # インスタンスの暗号化設定 db.t2.microではサポートしていない StorageType: gp2 # ストレージタイプ VPCSecurityGroups: - !GetAtt SecurityGroup.GroupId DeletionPolicy: Snapshot
最後にserverless deploy
コマンドでデプロイを行えば自動でmysqlサーバーが作成されます。
以上でmysqlの構築は完了となります。serverless-mysqlやprismaなどと繋げて利用できるようになったかと思います。 作成したDBインスタンスは AWS RDS上で確認が可能です。
まとめ
serverless frameworkでcloudformationを操作できることを理解してきたための挑戦でした。 Resourceをうまく利用することで今回のようにmysqlを構築するだけでなくさまざまな環境を容易に作成できるのはとても面白いなと感じました。 今後は他の構成も積極的に作ってみたいです。
会社の紹介
株式会社 mofmof では一緒に働いてくれるエンジニアを募集しています。 興味のある方は是非こちらのページよりお越しください! https://www.mof-mof.co.jp/ https://www.mof-mof.co.jp/recruit/
最後に
serverless remove
コマンドで一括でVPCごと削除できるのは楽でいいですね。試してみるにはちょうどいいですね。cloudformation最高!