AWS CodeDeployで遊んでみた

会社でCodeDeployを使ってたけど、使ったことなかったので遊んでみた。

AWS CodeDeployとは?

https://aws.amazon.com/jp/codedeploy/ より

AWS CodeDeploy は、Amazon EC2 インスタンス、およびオンプレミスで稼働するインスタンスを含む、さまざまなインスタンスへのコードのデプロイを自動化するサービスです。

シンプルなデプロイであればこれで十二分に思える。デプロイを自動化してくれるサービスなのでCI的なことをやりたいのであれば、CodePipelineとかつかうんだろう。

全体図

GitHubにpushするとCircleCIが走るので、テストが通ったらアプリをS3にput後デプロイする。 リージョンは安いからus-east-1

f:id:hs_hachi:20160911005810p:plain

内容

一部でも読んだドキュメント

IAMユーザとロールの作成

  1. APIを叩くためのユーザ(ユーザ名:codeDeployUser)を作成する(このユーザのaccess id をCircleCIに管理画面で登録する) Step 1: Provision an IAM User - AWS CodeDeploy をみてロールを適切に付与する。やりたいことにもよるが,最低限S3とCodeDeploy関連があればOK
  2. CodeDeployで実行するときに必要なデプロイグループ用ロール(ロール名:CodeDeployServiceRole)を作成する
    1. アクセス許可の管理ポリシーに AWSCodeDeployRole を追加する
    2. 信頼されたエンティティを追加する
  3. EC2を作るときに設定するIAMロール(ロール名:CodeDeployDemo-EC2)を作成する
    1. 管理用ポリシーに AmazonEC2FullAccess を追加した(ここは多分ちゃんと絞るべき)
    2. インラインポリシーにポリシー(ポリシー名:ec2-role-permission)を追加
    3. 信頼関係を追加する

CodeDeployServiceRoleの信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "codedeploy.us-east-1.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

CodeDeployDemo-EC2のインラインポリシー

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::aws-codedeploy-us-east-1/*"
            ]
        }
    ]
}

CodeDeployDemo-EC2の信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

S3バケットの追加

特定者からのみのアクセスをうけるように、バケットポリシーにユーザ codeDeployUserとロールCodeDeployDemo-EC2を追加した。

EC2ユーザ作成

2台以上で作ること。

  1. インスタンスを作成するときにIAMロールCodeDeployDemo-EC2を忘れない
  2. CodeDeployのグループの対象インスタンスとなるようにタグを作成するときにキー:Role, 値:WebAppという名前をつけた
  3. AWS CodeDeploy agentをインストールする

CodeDeployの設定

途中で失敗してもアプリの内容はロールバックしないので注意(正常にデプロイしたものがあればそれはそのまま)

  1. アプリケーションを新規で作成する
    • アプリケーション名:sample-app (ここは circle.ymlで使う)
    • デプロイグループ名:SampleAppsGroup (ここは circle.ymlで使う)
    • EC2インスタンスタグ:Role:WebApp
    • サービスロール ARN:CodeDeployServiceRole を選択した
    • デプロイ設定:CodeDeployDefault.OneAtATime ここはお好み

CircleCIの設定

  1. codeDeployUserのaccess Key IDとSecret Keyを登録する

アプリの設定

  1. circle.yml にデプロイの設定を記載
  2. appspec.yml にcodeDeployで実行する内容を記載する。(この辺はあまり調べられてない)

circle.ymlの内容の抜粋

deployment:
  staging:
    branch: master
    codedeploy:
      sample-app: # ここはアプリケーション名と合わせる
        application_root: /
        region: us-east-1
        deployment_group: SampleAppsGroup # ここはデプロイメントグループと合わせる
        revision_location:
          revision_type: S3
          s3_location:
            bucket: バケット名
            key_pattern: my-sample-app-{SHORT_COMMIT}-{BUILD_NUM} # キーパターンは適当

appspec.ymlの内容

version: 0.0
os: linux
files:
  - source: /
    destination: /usr/local/demo-app # アプリ配置先
hooks:
  BeforeInstall:
    - location: deploy/before_install.sh # インストールする前の実行するシェル(ELBから外すとか..)

その他

  • /var/log/aws/codedeploy-agent/codedeploy-agent.log にログが出るので途中で失敗した時は確認する