別アカウントのECRを取得してeb deployを実行する

## 困ってたこと
ソースコードはアカウントA内のCodeCommitにあって、CodePipelineなどを使って、テスト・デプロイなどを行っていた。
特定のブランチをpushするだけで、テストやデプロイが行われるのでかなり快適だった。

しかし、アカウントB内に環境を立ち上げないといけなくなり、我がチームの大先輩が教えてくれたので、今後のためにドキュメントに残しておこうと思います。

## やりたいこと

アカウントA内にあるECRを参照して、アカウントBにElastic Beanstalkを立ち上げる・更新する

## フローを簡単にまとめると

1. local開発環境からpushする
2. CodePipelineを通って、テスト・デプロイが行われる
3. 問題なければECRが更新される
4. アカウントBへデプロイするプロジェクトに移って「eb deploy」を実行する

## ECRのログイン情報を取得する

アカウントA内のECRを取得するためにログイン情報を取得します
下記コマンドを実行する。(このときのcredentialはアカウントAのIAM情報)

``` 
aws ecr get-login
```

結果

```
docker login -u AWS -p 文字列(★) ECRのエンドポイント
```

ECRを取得する際のログイン情報をjsonにして、アカウントB内のS3に置いておきます
例）バケット名：app-documents Key名：config.json

``` config.json
{
  "auths": {
    "ECRのエンドポイント": {
      "auth": "文字列(★)"
    }
  }            
}
```

## アカウントBへデプロイするためのプロジェクトを作成する
local開発環境からpushしてECRが更新された後、そのECRをもとにElastic Beanstalkを更新するためのプロジェクトを作成します。
このプロジェクト内で「eb deploy」を実行するとアカウントA内のECRを取得し、アカウントB内のElastic Beanstalkアプリケーションの環境を更新するできるようにします。

### Dockerの設定ファイルを作成する
Dockerコンテナ作成時の設定ファイルを作成します。

``` Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Authentication": {
    "Bucket": "app-documents",
    "Key": "config.json"
  },
  "Image": {
    "Name": "ECRのエンドポイント",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "3000"
    }
  ],
  "Volumes": [
    {
      "HostDirectory": "/var/log",
      "ContainerDirectory": "/var/www/logs"
    }
  ],
  "Logging": "/var/log"
}
```

### Elastic Beanstalkの設定
アカウントB内のElastic Beanstalk内の環境にデプロイをしたいので、アカウントBで作成したIAM情報を持ったcredentialを作成します。
そのprofileを使用する形で、「eb init --proflie アカウントB」を実行し、Elastic Beanstalkの設定を行います。

```
aws configure --profile accountb
AWS Access Key ID [****************]: アカウントBで作成したIAMのアクセスキー
AWS Secret Access Key [****************]: アカウントBで作成したIAMのシークレットアクセスキー
Default region name [ap-northeast-1]: 東京を選択(別リージョンでも問題はないかと)
Default output format [None]:

eb init --profile accountb

// 下記は一例
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) us-east-2 : US East (Ohio)
(default is 3): 9

Select an application to use
1) accountb
2) [ Create new Application ]
(default is 2): 2

Enter Application Name
(default is "accountb"): sample
Application sample has been created.

It appears you are using Docker. Is this correct?
(y/n): y

Select a platform version.
1) Docker 1.12.6
2) Docker 1.11.2
3) Docker 1.9.1
4) Docker 1.7.1
5) Docker 1.6.2
(default is 1): 1
Do you want to set up SSH for your instances?
(y/n): n

```

その後「eb create」を実行して、アカウントB内のElastic Beanstalkにアプリケーション及び環境を構築します。

```
eb create --vpc
// 適宜変更してください
Enter Environment Name
(default is sample-dev):
Enter DNS CNAME prefix
(default is sample-dev):

Select a load balancer type
1) classic
2) application
(default is 1): 2

Enter the VPC ID: アカウントBのVPC IT(EC2のダッシュボードから確認できます)
Do you want to associate a public IP address? (y/n): y
Enter a comma-separated list of Amazon EC2 subnets: アカウントBのsubnet。必ず複数指定してください(東京リージョンなら2つ)
Enter a comma-separated list of Amazon ELB subnets: アカウントBのsubnet。必ず複数指定してください(東京リージョンなら2つ)
Enter a comma-separated list of Amazon VPC security groups: アカウントBのVPCのセキュリティーグループ
Do you want the load balencer to be public? (Select no for internal) (y/n): y

```

処理が無事成功したら、作業完了です。
AWSのコンソール画面でも進捗を確認することができます。

今後、このプロジェクト内で「eb deploy」を実行すると、アカウントA内のECRを取得してElastic Beanstalkが更新されます。

このあたりの詳しい手順・説明は[こちら](http://qiita.com/Mic-U/items/f9f0c03080d9cf6c3cc6)を参考にしていただければと思います。


## まとめ
少し力技感が否めませんが、困っていたことを解消することができました。
また、pushした際のCodePipelineでアカウントA内にElastic Beanstalkを立ち上げると、検証環境的なものを作れるので、個人的にはいい感じだなと思います。

ほかにもっとよい方法があればご教授いただきたいです。