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

  • 0
    いいね
  • 0
    コメント

    困ってたこと

    ソースコードはアカウント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が更新されます。

    このあたりの詳しい手順・説明はこちらを参考にしていただければと思います。

    まとめ

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

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