👨‍💻

【AWS CI/CD】Codeシリーズのポイント簡単まとめ

2023/07/23に公開

はじめに

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

デプロイ設定

  1. CodeDeployアプリケーションを作成し、対象プラットフォーム(EC2、オンプレミス、Lambda、ECS)を決定
    • EC2、オンプレミスの定義済みのデプロイ設定
      • AllAtOnce
        • 正常なホストの最小数値:0
        • 一度に全てのインスタンスにデプロイ
      • HalfAtATime
        • 正常なホストの最小数値:50%
        • 一度に最大半分のインスタンスにデプロイ
      • OneAtATime
        • 正常なホストの最小数値:1
        • 一度に1つのインスタンスにデプロイ
    • ECSの定義済みのデプロイ設定
      • Canary(カナリア):最初一定の割合のみにリリースした後、指定した時間後に残りのリリースを完了させる
        • ECSCanary10Percent5Minutes:最初10%のみ移行、5分後に残りの90%移行
      • Linear(リニア、線形):最初一定の割合のみにリリースした後、指定した間隔でデプロイ対象を増分する
        • ECSLinear10PercentEvery1Minutes:全ての移行が完了するまで、1分ごとに10%ずつ移行
        • ECSAllAtOnce:一度に全てのコンテナにデプロイ
    • Lambda
      • バージョン
        • 開発後にバージョンを作成すると、コードや設定を変更できない
      • エイリアス
        • バージョンと紐付け
        • トリガーからLambda関数を呼び出す際にエイリアスを指定して呼び出す
      • 定義済みのデプロイ設定
        • LambdaCanary10Percent5Minutes:最初10%のみ移行、5分後に残りの90%移行
        • LambdaLinear10PercentEvery1Minute:全ての移行が完了するまで、1分ごとに10%ずつ移行
        • LambdaAllAtOnce :Lambda関数のバージョンを1回でデプロイする
  2. デプロイグループ(対象のEC2インスタンス、Auto Scalingグループ、ECSクラスタ、Lambda関数)を指定
  3. リビジョン、AppSpec、デプロイ設定を指定
    1. リビジョン:S3バケットかGitHubを指定
    2. AppSpec:デプロイ処理の詳細を指定
      • デプロイ処理をYAMLフォーマットで記述された通りに実行するデプロイ仕様
      • EC2インスタンス、オンプレミス向けのCodeDeployアプリケーションでは、一連のライフサイクルイベントに対して追加処理を設定できる
        • リビジョンにappspec.ymlを含めてデプロイで指定
        • コンソールによる追加定義で設定
    3. デプロイ設定:デプロイ方法を指定
  4. 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