AWSのデプロイサービスを使いこなそう!効率的なアプリケーションデプロイの実現方法
こんにちは!インフラ寄りの業務に携わっている関係でアプリ周りの理解が乏しいことから、AWSのデプロイサービスについて調べたものをまとめなおしてみました。
なぜCI/CDサービスを使うべきなのか
一般的な話題として、手動デプロイ運用に対する辛さがあるように見受けられました。例えば、チーム内でデプロイ手順の認識違いがあったり、本番作業のデプロイ時にミスをしたり...。そういったツライ経験は、CI/CDサービスを導入すると、すっきり改善できそうです。どのように改善できるかという観点では、具体的には以下のようなメリットがあります。
開発効率が劇的に向上
- 面倒なデプロイ作業が自動化され、コードを書くことに集中できる
- テストも自動化されるので、早期にバグを発見できる
- テスト環境だけでなく本番環境のデプロイ時でもミスの心配が少ない
デプロイの信頼性が格段にアップ
- 手作業によるミスがなくなる
- いつも同じ手順でデプロイされるので安心
- 問題が起きてもすぐにロールバックできる
AWSのデプロイサービスだったら、どれを選べばいいの?
AWSには主に3つのデプロイサービスがあります。それぞれのサービスにおける特徴について見ていきましょう。
AWS CodeDeploy
EC2やLambda、ECSなど、様々なプラットフォームに対応していて、特にブルー/グリーンデプロイが便利です。本番環境で新バージョンのテストができるので、安全にデプロイすることができます。
AWS Elastic Beanstalk
Elastic Beanstalkは「とにかく簡単にデプロイしたい!」という方におすすめ。インフラの細かい設定を意識せずに、アプリケーションのデプロイができます。
AWS CloudFormation
インフラをコードで管理したい場合はこちら。一度テンプレートを作ってしまえば、環境の複製が簡単にできて便利です。
AWS CodeDeployで実現できること
CodeDeployの良いところは、デプロイタイプを柔軟に選べることです。
インプレースデプロイ
これは既存のサーバーに直接デプロイする方式です。シンプルで分かりやすいのですが、デプロイ中にサービスが停止する可能性があるので注意が必要です。
ブルー/グリーンデプロイ
新環境を作ってからトラフィック切り替えるので、ダウンタイムがほとんどありません。ただし、新旧の両環境を一時的に立ち上げておく必要があるため、コストは若干高くなります。
Elastic Beanstalkのデプロイポリシーを使いこなす
Elastic Beanstalkには5つのデプロイポリシーがあります。
All at once
一度に全環境を更新する方式です。コストメリットがあるため、開発環境に向いていますが、本番環境では避けた方が無難です。
Rolling
コストと安定運用のバランスが良いパターンです。バッチ単位で更新(1インスタンス毎の更新)していくので、サービスを止めることなくデプロイできます。
Rolling with additional batch
Rollingの改良版で、追加容量を確保しながら更新するので、より安全に更新ができます。ただし、その分コストは上がります。
Immutable
新しい環境を作って切り替える方式です。安全性は高いのですが、デプロイに時間がかかることやその分コストがかかります。
Traffic splitting
段階的にトラフィックを移行できるので、新バージョンの問題を早期に発見できます。
CloudFormationでインフラをコード化する
CloudFormationはアプリとインフラをセットにデプロイせず、インフラ環境を中心にデプロイする場合に優位性があります。
例えば、以下のようなYAMLテンプレートで、EC2インスタンスを作成することができます。
Resources:
# EC2 インスタンス
MyEC2Instance:
Type: "AWS::EC2::Instance"
Properties:
InstanceType: "t2.micro" # インスタンスタイプを指定
ImageId: "ami-0123456789abcdef0" # AMIのIDを指定
SecurityGroupIds:
- !Ref MySecurityGroup # セキュリティグループの参照
SubnetId: "subnet-0123456789abcdef" # VPC内のサブネットIDを指定
Tags:
- Key: Name
Value: MyInstance
# セキュリティグループ
MySecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "Enable SSH access"
VpcId: "vpc-0123456789abcdef" # 使用するVPC IDを指定
SecurityGroupIngress:
- IpProtocol: "tcp"
FromPort: "22" # SSH用
ToPort: "22"
# グローバルアクセス(セキュリティ上の理由で本番環境では制限することを推奨)
CidrIp: "0.0.0.0/0"
Outputs:
InstanceId:
Description: "The Instance ID of the EC2 instance"
Value: !Ref MyEC2Instance
まとめ
AWSのデプロイサービスは選択肢が多くて戸惑いやすいですが、それぞれの特徴を生かして利用することでよりアプリケーションコードに集中して開発ができるものと推測しています。
この記事がどなたかのお役に立てれば幸いです。