/codedeploy-test

AWS Code Deploy のテスト

Primary LanguageShellMIT LicenseMIT

AWS Code Deploy のテスト

ざっくり概要

  • S3にアップロードしたレビジョンファイル(zip)またはgithubのリポジトリからデプロイできる

  • 構成単位は

  • Deploy Application

  • レビジョンとDeploy Groupのコンテナ

  • Deploy Group

  • デプロイ対象とデプロイ方法を定義したもの

  • デプロイ対象はAutoscaleグループやタグで指定できる

  • デプロイ方法はin placeとblue greenが指定できる

  • デプロイは「Deploy Gropuにレビジョンをデプロイする」といった形で行なう

  • Autoscale時に自動でデプロイが可能(IAMにアプリをインストールしておかなくても良い)

インスタンスプロファイルについて

  • インスタンスプロファイル == IAMロールと考えて殆ど問題ない

  • インスタンスプロファイル一つにつきRoleは一つだけ指定できる(複数のロールを指定できない)

  • EC2インスタンスに設定するのは実はIAMロールではなくインスタンスプロファイル

  • 画面からIAMロールを作ると同じ名前のインスタンスプロファイルが作成される

  • APIから作った場合はそれぞれ個別に紐付ける

  • 一対一なのでIAMロールに適切にEC2インスタンスの役割を設定する必要がある

アカウントIDを保存

  • ARNを作るときにいろいろと必要

% aws sts get-caller-identity --query 'Account' --output text > account-id

S3バケットを準備

% aws s3 mb s3://buzztaiki-codedeploy-test

Role

Code Deploy ロール

  • Deploy Group に設定するIAMロール

  • 「Code DeployがAWSCodeDeployRoleで定義されるサービスにアクセス可能である」と定義される

  • Principal には codedeploy.ap-northeast-1.amazonaws.com を指定してリージョンを特定する事もできる

% aws iam create-role --role-name codedeploy-test-role --assume-role-policy-document file://codedeploy-test-role.json
% aws iam attach-role-policy --role-name codedeploy-test-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole
% aws iam get-role --role-name codedeploy-test-role

EC2 インスタンスプロファイル (IAMロール)

  • EC2インスタンスに設定するIAMロール(インスタンスプロファイル)

  • EC2から指定のS3バケットに対してGet, List可能であると定義される

  • S3ReadOnlyAccess も使えなくはないけど、適切にS3バケットを指定した方が良いでしょう

% aws iam create-role --role-name codedeploy-test-ec2-role --assume-role-policy-document file://codedeploy-test-ec2-role.json
% aws iam put-role-policy --role-name codedeploy-test-ec2-role --policy-name codedeploy-test-ec2-policy --policy-document file://codedeploy-test-ec2-policy.json
% aws iam create-instance-profile --instance-profile-name codedeploy-test-ec2-role
% aws iam add-role-to-instance-profile --instance-profile-name codedeploy-test-ec2-role --role-name codedeploy-test-ec2-role

インスタンス作成

% aws ec2 run-instances --image-id ami-afb09dc8 --count 1 --instance-type t2.micro --key-name buzztaiki \
      --security-groups ssh http --iam-instance-profile Name=codedeploy-test-ec2-role \
      --user-data file://user-data-script.bash \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=codedeploy-test}]'

Deploy Application の作成

% aws deploy create-application --application-name codedeploy-test

Deploy Group の作成

  • service-role-arn で「Code Deploy ロール」で作ったロールのarnを指定する

  • ec2-tag-filters で対象のインスタンスを指定する

  • auto-rollback-configuration で自動ロールバックを有効に設定してる (失敗したら前回成功したリビジョンでデプロイしなおし)

  • deployment-style でインスタンス内のファイル差し替えを指定してる (Blue Greenも指定できる)

% aws deploy create-deployment-group --application-name codedeploy-test --deployment-group-name codedeploy-test-group \
      --deployment-config-name CodeDeployDefault.OneAtATime \
      --auto-rollback-configuration enabled=true,events=DEPLOYMENT_FAILURE \
      --deployment-style deploymentType=IN_PLACE,deploymentOption=WITHOUT_TRAFFIC_CONTROL \
      --ec2-tag-filters Key=Name,Value=codedeploy-test,Type=KEY_AND_VALUE \
      --service-role-arn arn:aws:iam::$(cat account-id):role/codedeploy-test-role

デプロイ

  • リビジョンを登録してからデプロイする

  • create-deployment で etag を指定しないと対象のキーの最新の中身でデプロイされる

% aws deploy push --application-name codedeploy-test --s3-location s3://buzztaiki-codedeploy-test/codedeploy-test.zip  --ignore-hidden-files --source .
% aws deploy create-deployment --application-name codedeploy-test --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name codedeploy-test-group --s3-location bucket=buzztaiki-codedeploy-test,bundleType=zip,key=codedeploy-test.zip

CircleCIを設定する

IAMユーザーの作成

  • デプロイに必要な権限を定義したポリシーを付与する

  • CircleCIからデプロイするのに利用する

% aws iam create-user --user-name circleci
% cat codedeploy-test-deployer-policy.json | id=$(cat account-id) perl -pe 's/{account-id}/\Q$ENV{id}/g' > codedeploy-test-deployer-policy-gen.json
% aws iam put-user-policy --user-name circleci --policy-name codedeploy-test-deployer-policy --policy-document file://codedeploy-test-deployer-policy-gen.json

IAMユーザーの認証情報を取得して設定する

% aws iam create-access-key --user-name circleci --output json > circleci.key
# CircleCIに設定してから
% rm circleci.key

circle.yml に codedeploy の設定をする

  • master は普通にCircleCIが提供しているcodedeployディレクティブを使ってデプロイする例

  • awscli は自前でデプロイする例

  • codedeployディレクティブを使った場合デプロイの前にバンドルを作る事ができないので、その場合は awscli を使うと良い