AWS Amplifyのmultienvで環境名に大文字を使うとS3構築時にエラーになる

# AWS Amplify
AWSにアプリケーションに必要なバックエンド環境をコマンドで構築できて、フロントエンドアプリからのつなぎ込みも簡単にできる、涙が出るほど便利なフレームワークです。
https://aws-amplify.github.io/

# multienvプラグイン
そんなAWS Amplifyには、バックエンドの環境を複製したり、切り替えたりできるコマンドが提供されています。
それが、multienvプラグインです。
（まだ betaです）
https://aws-amplify.github.io/docs/cli/multienv?sdk=js

# 環境名に大文字を使用するとエラー
タイトルの通りですが、環境名にアルファベットの大文字を使用すると、エラーになります。
## 手順
まず、環境の新規作成を行います。
    
    amplify init

ここで、既存の環境の初期化をするか、新たな環境を入力するかを聞かれます。

    $ amplify init
    Note: It is recommended to run this command from the root of your app 
    directory
    You're initializing your project with a beta version of the CLI which 
    supports multiple environments of your project
    ? Do you want to use an existing environment? (Y/n) <- nを入力

すると環境名の入力を促されます。
ここで、大文字を含んだアルファベットの環境名を入力しました。

    ? Enter a name for the environment DevYS <- 大文字を含んだ環境名を入力

その後なんやかんや聞かれますが、既存の環境複製時は基本的に全てそのままEnterで進みます。
完了したら、実際にAWSバックエンドを構築します。

    $ amplify push

これで、環境がめでたく複製されるはずだったのですが。。。

## amplify　push のエラー

    ✖ An error occurred when pushing the resources to the cloud

    Resource is not in the state stackUpdateComplete

失敗しますorz
この少し前に、Cloudformationのログが出ているので、見てみます。

```
CREATE_IN_PROGRESS functionnomadmatchinge620bc79                                   AWS::CloudFormation::Stack Fri Feb 08 2019 21:00:51 GMT+0900 (JST) Resource creation Initiated
CREATE_IN_PROGRESS hostingS3AndCloudFront                                          AWS::CloudFormation::Stack Fri Feb 08 2019 21:00:51 GMT+0900 (JST) Resource creation Initiated
CREATE_IN_PROGRESS nomad-matching-20190208205622-authcognito09b59faa-1BNMU3OAVOXEB AWS::CloudFormation::Stack Fri Feb 08 2019 21:00:51 GMT+0900 (JST) User Initiated             
CREATE_IN_PROGRESS authcognito09b59faa                                             AWS::CloudFormation::Stack Fri Feb 08 2019 21:00:52 GMT+0900 (JST) Resource creation Initiated
⠼ Updating resources in the cloud. This may take a few minutes...

CREATE_FAILED               S3Bucket                                                                  AWS::S3::Bucket            Fri Feb 08 2019 21:00:57 GMT+0900 (JST) Bucket name should not contain uppercase chara
cters                                                                                                                                                                                                                 
CREATE_IN_PROGRESS          nomad-matching-20190208205622-functionnomadmatchinge620bc79-1NL68GUN8AKBX AWS::CloudFormation::Stack Fri Feb 08 2019 21:00:51 GMT+0900 (JST) User Initiated                                
```

S3バケットの作成失敗が、最初に発生したエラーのようで、これが原因でCloudformationスタックがロールバックされているようです。

## S3バケット作成エラーの原因を探る
もっと情報が欲しいのですが、S3を構築したCloudformationスタックは、ロールバックで削除されてしまっているので、既にありません。
AWS Amplifyでは、APIやAuth、Hostingといった機能単位でCloudformationスタックをネストして作成しています。
上記のS3バケットは、Hosting機能のNestedStackで作成されます。
（ルートスタックは、amplify init時に作成されています。）

このため、もう一度同じ操作をして、ネストされたHostingのCloudformationスタックがロールバックで削除されてしまう前に、（作成途中の段階で）みてみました。
![ 2019-02-08 21.01.47.png](https://qiita-image-store.s3.amazonaws.com/0/103461/5a53617b-1f24-73c7-df90-f7e857389f75.png)

「Bucket name should not contain uppercase characters」

...え？
S3バケットってそんなルールあったっけ...？

## S3の命名規則が変更されていた
AWSのドキュメントを確認してみると、2018年3月1日から、命名規則が変わっていた模様。
全然気がつかなかった。

![ 2019-02-08 21.02.53.png](https://qiita-image-store.s3.amazonaws.com/0/103461/c08a63e7-1e3e-eba9-8448-7aaa5a94e46c.png)


# まとめ
AWS Amplifyとmultienvを使うとサクッと環境構築できますが、こんな落とし穴もありました。
知識共有と、トラブルシューティング手順の参考にでもなれば幸いです。