AWS CLIとCloudFormationを使ってスタックを作成する

この記事を書いている私について

AWS CloudTechという動画学習サービスに参加し、AWSエンジニアを目指すための備忘録です:fire:


本記事の目標
-

前回の「初めてのCloudFormation 環境準備からVPC作成まで」に引き続き、
今回はAWS CLIkからRDSをスタックを作成します。

https://qiita.com/zetzetn/items/67f52ad6cedd68439229

まず最初にAWC CLI環境を整えます。
その後、CLIからSSH接続しCloud Formationを使ってプロビジョニングします。


前提条件
-
・PCはWindows10が前提。
　Macの方は必要な個所を読み替えていただくようお願いします。
・下記構成図のようにVPC/EC2（キーペア設定済）/サブネットを作成済みであること。
　　※VPCは前回の記事で作成しているため、再利用します。
　　　下記構成図に記載しているRDSはCloud Formationにて作成します。


今回の構成図
-
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/79e5f273-ef15-09f8-ca56-529ce52a1c6d.png)


構築の流れ
-

以下の流れで構築を進めます。

・コンソールからIAM権限を付与
・Remote-SSH開発環境を整える
・AWS CLIの設定
・CloudFormation スタックの作成
・構築出来たか確認
・CloudFormation スタックを削除


・コンソールからIAM権限を付与
-
・IAMコンソールを開き、```ec2-user```を作成します。
　その後、アクセス権限の追加から既存のポリシーをアタッチを選択。
　ポリシーの中から```EC2/CloudFormation/VPC```の権限をアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/268c662f-1299-d3b9-baa1-ed282ee4db6e.png)
　※必要な権限だけを割り振るのが良いですが、割り振る権限が分からない方はフルアクセスをアタッチすることになると思います。
　　その場合、学習後は権限を削除しておきましょう。

・認証情報から```アクセスキーの作成```を行い、```アクセスキーID```と```シークレットアクセスキー```をメモしておきます。
　※シークレットアクセスキーは一度しか表示されませんので、必ずメモして安全な場所に保管しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/edebfbb0-c03a-8cbc-e4a9-2e5756cdd418.png)

・VSCodeのRemote-SSH開発環境を整える
-
下記の記事を参考にしました。

https://blog.serverworks.co.jp/tech/2020/02/20/vscode-remote-ssh/

まず、VSCodeのプラグイン```Remote - SSH```をインストールします。
開発用インスタンス（EC2）を起動し、SSH ログイン設定を行います。
設定後は開発用インスタンスにログインできることを確認します。


・AWS CLIの設定
-

・AWS CLIのインストールを行っていきます。
下記の記事を参考にしました。

https://qiita.com/dr3mms/items/4fb4b73645893bb9b19f

・AWS CLIのconfigファイルを設定していきます。

開発用インスタンス（EC2）にSSH接続を行った後、
ホームディレクトリの下の「.aws」（隠しディレクトリ）にあるテキストファイル
「config」と「credentials」ファイルを作成します。
　①config
　　AWSCLIコマンドの出力形式と操作対象のリージョンを記載する。
　（出力形式は、jsonにする）　
　②credentials
　　IAM権限のアクセスキー、シークレットアクセスキーを記載する。
　　[！！注意！！]絶対に外部に公開しないこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/f3f1ff6a-81d7-3cd2-f90a-14c51b9f4ac9.png)


・CloudFormation スタックの作成
-
ここからCloudFormationのコマンドを使ってRDSを作成していきます。
 ※詳細は他に素晴らしい記事がたくさんありますのでここでは割愛します。

```php:stack.yml
AWSTemplateFormatVersion: "2010-09-09"

# ------------------------------------------------------------#
# Description
# ------------------------------------------------------------# 
Description: CloudTechDemo

# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------# 

#スタック作成時に入力する各種パラメータ
Parameters:
#データベースパスワード
  DatabasePassword:
    Type: String
    Description: Database password
    NoEcho: "true"

#サブネット
  ApplicationSubnets:
    Type: List<AWS::EC2::Subnet::Id>
    Description: Target subnets

 #VPCのサイダー
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: Target VPC

 #DBinboundのサイダー
  DBinboundCidrIPs:
    Type: String
    Description: SecurityGroupInboundIP

# ------------------------------------------------------------#
# Resources
# ------------------------------------------------------------# 
#作成する各種AWSリソース
Resources:

  #RDS
  ApplicationDatabase:
    Type: AWS::RDS::DBInstance

  #RDSのプロパティ
    Properties:
      Engine: MySQL
      EngineVersion: 5.7
      DBInstanceClass: db.t2.micro
      AllocatedStorage: 10
      StorageType: gp2
      MasterUsername: CloudTech
      MasterUserPassword:
        Ref: DatabasePassword
      DBName: CloudTech
      VPCSecurityGroups:
        - !Ref ApplicationDatabaseSecurityGroup
      DBSubnetGroupName: !Ref ApplicationDatabaseSubnetGroup
      MultiAZ: "false"
      AvailabilityZone: !Sub ${AWS::Region}a
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-db

  #サブネットグループ
  ApplicationDatabaseSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: Application Database Subnet Group
      SubnetIds: !Ref ApplicationSubnets
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-db-subnet-group

  #セキュリティグループ
  ApplicationDatabaseSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: !Sub ${AWS::StackName} Application Database Security Group
      VpcId: !Ref VpcId
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 3306
        ToPort: 3306
        CidrIp: !Ref DBinboundCidrIPs
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-db-sg
}

```
```php:dev.cfg
DatabasePassword=xxxx
ApplicationSubnets=sb-xxxx,sb-xxxx
VpcId=xxxx
DBinboundCidrIPs=xxxx
}
```
※xxxxの中身はご自身の環境に置き換えて記載してください。

###コードの中身について
ファイルをstack.ymlとdev.cfgの２つに分けて記述しています。
cfgファイルを分割することで環境毎に違う設定をまとめて管理することが出来ます。


###コマンド実行
下記のコマンドで作成したファイルをデプロイします。
```aws cloudformation deploy --template-file stack.yml --stack-name RDSmySQLcreate --parameter-overrides $(cat dev.cfg)```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/c9dca647-f475-2479-db1c-b594137c66eb.png)

エラーが無ければ、想定通り構築出来たかコンソール画面を確認していきます。

エラーが発生した場合、下記のメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/659b0c80-f04a-54a1-bcf2-a264e38b6e58.png)

イベントからエラー内容を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/f39042b1-f0da-71bd-4904-fd15b46b456a.png)
　※エラーが無い場合は上記のようにステータスが```CREATE_COMPLETE```となります。


・構築出来たか確認
-
下記の確認をします。

・コマンド実行後、CloudFormationに画面を切り替えると```RDSmySQLcreate``` というスタックが作成実行中となってから、下記の確認を行う。
・RDSのデータベースエンジンは指定したとおりのものになっていること。
・リージョンは```ap-northeast-1a```、インスタンスタイプは```db.t2.micro```、そしてVPCは設定ファイルで指定したVPCで狙いどおりにデプロイされていること。
・アベイラビリティゾーン/サブネットが想定どおりになっていること。
・セキュリティグループのインバウンドルールを確認すると、```ポート3306```で、CIDR IPは設定ファイルで指定したとおりのレンジになっていること。



・CloudFormation スタックを削除
-
下記コマンドからRDSはをスタックごと削除します。
```aws cloudformation delete-stack```

削除したら必ずCloudFormationの画面からも削除されたことを確認してから終了するようにして下さい。
RDSの画面からも作成したRDSが削除中になっていることを確認して下さい。


以上で終了です。お疲れ様でした。



本課題で発生する費用
-
EC2　X　1
RDS　X　1

一日辺り5円ほどになります。


最後に
-

AWS CLIを使ってCloudFormationを実行する方法が分かりました。
AWS CLI、IAM周りでハマってしまったので、
今後はLinuxやIAM周りを意識して勉強しよう考えています。

AWS CloudTechの課題としてこれらが残っていますので、
やったことを今後のQiita記事にして発信していきたいと思います。
これから始められる方の参考になれば嬉しいです。

今後の学習予定↓↓↓
・Lamda関数
・Udemy教材
　AWSで作るWEBアプリケーション 実践講座
　https://www.udemy.com/course/webapplication-on-aws/learn/lecture/22580692#overview
・AWS公式ハンズオン
・社内でAWSハンズオン開催←NEW！！

　

内容に不備がございましたら、ご指摘いただけますと幸いです。


今後の励みになりますので、良ければ「LGTM」をお願いします。 :bow:
閲覧ありがとうございました。

---
この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」のハンズオンを基に作成しました。

https://aws-cloud-tech.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465906/00637e63-5339-1b83-c3c1-720e95174ec0.png)