👨💻
【AWS CI/CD】Codeシリーズのポイント簡単まとめ
はじめに
AWS Codeシリーズはソフトウェア開発に特化したサービス群であり、アプリケーションのビルド、デプロイ、運用に関する幅広い機能を提供しています。本記事では、AWS Codeシリーズの主要なポイントをまとめて紹介します
AWS CodeCommit
ソースリポジトリサービス
プライベートなGitリポジトリをチームにプライベートで提供
- アクセス制限:IAMポリシー
- データ暗号化:AWSマネージドキー(aws/codecommitキー)によってサーバーサイド暗号化
- アクセス履歴管理:CloudTrail
AWS CodeBuild
ビルドとテストを実行するコンテナ環境を完全なマネージドで提供
- ビルド環境:AWSが用意したLinux・Windowsコンテナ、任意のコンテナ
- ソースコードリポジトリ:CodeCommit、S3バケット、GitHub、Bitbucket
-
buildspec.yml
:テスト、コンパイル、パッケージ作成、コンテナイメージの作成などを定義したファイル - 作成されたパッケージの保存
- 指定したS3バケット
-
buildspec.yml
に定義したdocker pushコマンドでアップロードしたECRリポジトリ
AWS CodeDeploy
EC2インスタンス、ECSのコンテナ、Lambda関数、オンプレミスサーバーへのデプロイを自動化
アプリケーションリビジョン
- アプリケーションをインストールするためのファイル群
- 保存先:S3バケット、GitHub
デプロイ設定
- CodeDeployアプリケーションを作成し、対象プラットフォーム(EC2、オンプレミス、Lambda、ECS)を決定
-
EC2、オンプレミスの定義済みのデプロイ設定
- AllAtOnce
- 正常なホストの最小数値:0
- 一度に全てのインスタンスにデプロイ
- HalfAtATime
- 正常なホストの最小数値:50%
- 一度に最大半分のインスタンスにデプロイ
- OneAtATime
- 正常なホストの最小数値:1
- 一度に1つのインスタンスにデプロイ
- AllAtOnce
-
ECSの定義済みのデプロイ設定
-
Canary(カナリア):最初一定の割合のみにリリースした後、指定した時間後に残りのリリースを完了させる
- ECSCanary10Percent5Minutes:最初10%のみ移行、5分後に残りの90%移行
-
Linear(リニア、線形):最初一定の割合のみにリリースした後、指定した間隔でデプロイ対象を増分する
- ECSLinear10PercentEvery1Minutes:全ての移行が完了するまで、1分ごとに10%ずつ移行
- ECSAllAtOnce:一度に全てのコンテナにデプロイ
-
Canary(カナリア):最初一定の割合のみにリリースした後、指定した時間後に残りのリリースを完了させる
-
Lambda
- バージョン
- 開発後にバージョンを作成すると、コードや設定を変更できない
- エイリアス
- バージョンと紐付け
- トリガーからLambda関数を呼び出す際にエイリアスを指定して呼び出す
- 定義済みのデプロイ設定
- LambdaCanary10Percent5Minutes:最初10%のみ移行、5分後に残りの90%移行
- LambdaLinear10PercentEvery1Minute:全ての移行が完了するまで、1分ごとに10%ずつ移行
- LambdaAllAtOnce :Lambda関数のバージョンを1回でデプロイする
- バージョン
-
EC2、オンプレミスの定義済みのデプロイ設定
- デプロイグループ(対象のEC2インスタンス、Auto Scalingグループ、ECSクラスタ、Lambda関数)を指定
- リビジョン、AppSpec、デプロイ設定を指定
- リビジョン:S3バケットかGitHubを指定
-
AppSpec:デプロイ処理の詳細を指定
- デプロイ処理をYAMLフォーマットで記述された通りに実行するデプロイ仕様
- EC2インスタンス、オンプレミス向けのCodeDeployアプリケーションでは、一連のライフサイクルイベントに対して追加処理を設定できる
- リビジョンにappspec.ymlを含めてデプロイで指定
- コンソールによる追加定義で設定
- デプロイ設定:デプロイ方法を指定
- CodeDeployエージェントをインストール:EC2インスタンス、オンプレミスサーバー
AWS CloudFormation
- テンプレートをもとにAWSリソースをスタック単位で作成
- Resourcesにカスタムリソースを含めて任意のLambda関数を実行できる
ヘルパースクリプト
- Amazon Linux AMI:インストール済み(/opt/aws/bin)
- aws-cfn-bootstrapパッケージをインストールしても使用可能
- 例
-
cfn-init
- パッケージのインストール、ファイル作成、サービス開始などが可能
- テンプレートではAWS::CloudFormation::Initで定義
- packages:ソフトウェアパッケージをインストール(EC2インスタンス)
- files:ファイルを作成(EC2インスタンス)
- commands:コマンド実行(EC2インスタンス)
- services:サービスの自動起動の有効化、起動
- groups:Linuxグループ作成
- users:Linuxユーザー作成
- sources:アーカイブファイルをダウンロードして展開
- AWS::CloudFormation::Initの定義は、EC2インスタンスのメタデータ(属性情報)に設定
- cfn-initを実行すると、メタデータに定義されたInitで処理
- cfn-initの実行はUserDataで設定
UserData
組み込み関数を使用するFn::Join
プロパティUserData: !Base64 'Fn::Join': - '' - - | #!/bin/bash -xe - '' - yum install -y aws-cfn-bootstrap - '/opt/aws/bin/cfn-init -v ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerInstance ' - ' --configsets InstallAndRun ' - ' --region ' - !Ref 'AWS::Region' - |+
-
cfn-signal
- セットアップが完了した信号をCreationPolicy、またはWaitConditionに送信できる
-
スタックポリシー
- 意図しない更新を防ぐために使用
- スタック作成時にJSONフォーマットで定義し、明示的に許可されていない変更は暗黙的に拒否される
DeletionPolicy(削除ポリシー)
スタック削除時に特定のリソースを保護する
Amazon S3 バケットリソースの削除ポリシーが
Retain
に設定されている
このスタックを削除すると、CloudFormation は、バケットを削除することなく、そのまま維持する
AWSTemplateFormatVersion: '2010-09-09'
Resources:
myS3Bucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
AWS CDK
ソースコードからCloudFormationテンプレートを生成
- CDKコマンド
- cdk init:CDKプロジェクトのスケルトンを作成
- cdk list(ls):プロジェクトに含まれるスタック一覧表示
- cdk deploy:プロジェクトに含まれるスタックをデプロイ
- cdk synthesize(synth):CDKのコードをテンプレートにして表示
- cdk diff:CDKのコードとスタックで差異がないか表示
- cdk destroy:スタック削除
AWS CodePipeline
ソース、ビルド(テスト)、デプロイのCI/CD パイプラインを自動化
- ソースステージ:リポジトリソースコードが更新された際に、パイプラインが実行される
- ビルドステージ:ビルドやテストコマンドが実行され、実行可能なアーティファクトが作成される
- デプロイステージ:CodeDeployやCloudFormationによってデプロイされる
Discussion