CloudFormationでAmazon DynamoDBテーブルを作成してみた

# はじめに
CloudFormationでAmazon DynamoDBを作成したので、手順メモです。

# 準備
aws-cliを使用してCloudFormationを実行するためインストールを行います。

## aws-cliをインストール
[AWS CLI のインストール(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html) に手順は記載されています。

```bash
$ pip3 install awscli --upgrade --user
$ aws --version
bash: /usr/local/bin/aws: /usr/local/opt/python/bin/python3.6: bad interpreter: No such file or directory
```

自分の環境では`bad interpreter`というエラーがでました。
下記を参考にして再インストールを実施したら解決できました。
[Fixing the 'Bad Interpreter' Error from AWS and Python 3.7](https://chipcullen.com/fixing-bad-interpreter-error-aws-python-3_7/)
[Macにpythonをインストールしaws-cliが実行できない経緯と解決方法](https://qiita.com/Masayuki-M/items/347e86bb683dbff468a9)

```bash
$ brew reinstall awscli
$ brew link --overwrite awscli
$ aws --version
aws-cli/1.16.170 Python/3.7.3 Darwin/18.6.0 botocore/1.12.160
```

## アクセスキー作成
aws-cliを実行するために必要なクレデンシャルを作成します。
[AWSアクセスキー作成](https://qiita.com/miwato/items/291c7a8c557908de5833) の記事がわかりやすいです。

### IAMの設定
IAMの設定画面から設定を進めていきます。
<img width="1031" alt="スクリーンショット 2019-07-20 11.03.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/06fba78d-bfdc-c49b-b022-1c3afa6e80d9.png">

とりあえずFull Accessにしています。
<img width="994" alt="スクリーンショット 2019-07-20 11.05.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/a13fc901-d838-9ae3-4433-2fb6a6b399b9.png">

クレデンシャル情報をcsvでダウンロードしておきます。
<img width="962" alt="スクリーンショット 2019-07-20 13.09.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/9d2b3699-a58b-3c5a-7cf9-2a9fe28982c7.png">

## aws configureの設定
取得したクレデンシャル情報をconfigに設定します。
設定ファイルは `~/.aws/credentials` に設定されています。

```
$ aws configure
AWS Access Key ID [****************5RHA]: xxxxxxx
AWS Secret Access Key [****************CNsa]: xxxxxxx
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [json]:
```

# cloudFormationファイル
[AWS::DynamoDB::Table(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) にsampleコードがあるのでそれを使用しています。
少し長いのでコード折りたたんでおきます。

<details><summary>cloudFormation.yml</summary><div>

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Resources: 
  myDynamoDBTable: 
    Type: AWS::DynamoDB::Table
    Properties: 
      AttributeDefinitions: 
        - 
          AttributeName: "Album"
          AttributeType: "S"
        - 
          AttributeName: "Artist"
          AttributeType: "S"
        - 
          AttributeName: "Sales"
          AttributeType: "N"
        - 
          AttributeName: "NumberOfSongs"
          AttributeType: "N"
      KeySchema: 
        - 
          AttributeName: "Album"
          KeyType: "HASH"
        - 
          AttributeName: "Artist"
          KeyType: "RANGE"
      ProvisionedThroughput: 
        ReadCapacityUnits: "5"
        WriteCapacityUnits: "5"
      TableName: "myTableName"
      GlobalSecondaryIndexes: 
        - 
          IndexName: "myGSI"
          KeySchema: 
            - 
              AttributeName: "Sales"
              KeyType: "HASH"
            - 
              AttributeName: "Artist"
              KeyType: "RANGE"
          Projection: 
            NonKeyAttributes: 
              - "Album"
              - "NumberOfSongs"
            ProjectionType: "INCLUDE"
          ProvisionedThroughput: 
            ReadCapacityUnits: "5"
            WriteCapacityUnits: "5"
        - 
          IndexName: "myGSI2"
          KeySchema: 
            - 
              AttributeName: "NumberOfSongs"
              KeyType: "HASH"
            - 
              AttributeName: "Sales"
              KeyType: "RANGE"
          Projection: 
            NonKeyAttributes: 
              - "Album"
              - "Artist"
            ProjectionType: "INCLUDE"
          ProvisionedThroughput: 
            ReadCapacityUnits: "5"
            WriteCapacityUnits: "5"
      LocalSecondaryIndexes: 
        - 
          IndexName: "myLSI"
          KeySchema: 
            - 
              AttributeName: "Album"
              KeyType: "HASH"
            - 
              AttributeName: "Sales"
              KeyType: "RANGE"
          Projection: 
            NonKeyAttributes: 
              - "Artist"
              - "NumberOfSongs"
            ProjectionType: "INCLUDE"
```
</div></details>

# 実行
作成と削除は冪等性なので何度実行しても問題ありません。

## 作成
[スタックの作成(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html)

```
aws cloudformation create-stack --stack-name sample --template-body file://cloudFormation.yml
```

<img width="1063" alt="スクリーンショット 2019-07-20 13.18.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/848f6519-6fca-7a8a-6709-8b24a2aae633.png">

## 削除
[スタックの削除(公式ドキュメント)](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-cli-deleting-stack.html)

```
aws cloudformation delete-stack --stack-name sample
```

# 参考URL
[CloudFormationをとりあえず実行してみたい人のためのチュートリアル](https://qiita.com/shoda_k/items/9a67e9137a077a921530)