困ってたこと
ソースコードはアカウントA内のCodeCommitにあって、CodePipelineなどを使って、テスト・デプロイなどを行っていた。
特定のブランチをpushするだけで、テストやデプロイが行われるのでかなり快適だった。
しかし、アカウントB内に環境を立ち上げないといけなくなり、我がチームの大先輩が教えてくれたので、今後のためにドキュメントに残しておこうと思います。
やりたいこと
アカウントA内にあるECRを参照して、アカウントBにElastic Beanstalkを立ち上げる・更新する
フローを簡単にまとめると
- local開発環境からpushする
- CodePipelineを通って、テスト・デプロイが行われる
- 問題なければECRが更新される
- アカウント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
{
"auths": {
"ECRのエンドポイント": {
"auth": "文字列(★)"
}
}
}
アカウントBへデプロイするためのプロジェクトを作成する
local開発環境からpushしてECRが更新された後、そのECRをもとにElastic Beanstalkを更新するためのプロジェクトを作成します。
このプロジェクト内で「eb deploy」を実行するとアカウントA内のECRを取得し、アカウントB内のElastic Beanstalkアプリケーションの環境を更新するできるようにします。
Dockerの設定ファイルを作成する
Dockerコンテナ作成時の設定ファイルを作成します。
{
"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が更新されます。
このあたりの詳しい手順・説明はこちらを参考にしていただければと思います。
まとめ
少し力技感が否めませんが、困っていたことを解消することができました。
また、pushした際のCodePipelineでアカウントA内にElastic Beanstalkを立ち上げると、検証環境的なものを作れるので、個人的にはいい感じだなと思います。
ほかにもっとよい方法があればご教授いただきたいです。