Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CI/CDプロセスにCloudFormationを本気導入するために考えるべきこと

 CI/CDプロセスにCloudFormationを本気導入するために考えるべきこと

AWSリソースのプロビジョニングとして幅広く利用されているCloudFormation。みなさん、利用していますか?コードでインフラを管理する上で避けては通れないサービスですが、これをCI/CDプロセスに組み込み、インフラの自動的な追加〜更新運用するためには、考えないといけないことが山のようにあります。

このセッションでは、手元のクライアントやEC2からCloudFormationを実行している運用から一歩踏み出して、CI/CDプロセスにCloudFormationを組み込むために考えないといけないことをお話します。

濱田孝治

March 20, 2021
Tweet

More Decks by 濱田孝治

Other Decks in Technology

Transcript

  1. #jawsdays2021 #jawsdays2021_C 3 ⾃⼰紹介 濱⽥孝治(ハマコー) • CX事業本部 MADチーム マネージャー •

    Japan APN Ambassador 2020 • JAWS-UG コンテナ⽀部運営 • 好きなサービス︓ECS, EKS, CloudFormation • 好きな⾔葉「わっしょい」
  2. #jawsdays2021 #jawsdays2021_C 12 CloudFormationの位置付け CloudFormation VPC Public subnet Amazon EMR

    Amazon Kinesis Data Firehose Amazon Athena Amazon Simple Notification Service Amazon Simple Queue Service Amazon EC2 Amazon Elastic Container Service AWS Lambda AWS Fargate Amazon WorkSpaces AWS IoT Core Amazon Personalize Amazon CloudWatch Amazon Simple Storage Service (S3) Amazon RDS
  3. #jawsdays2021 #jawsdays2021_C 22 Infrastructure as Codeとはなにか︖ コードでインフラを定義する⼿法 Resources: FirstVPC: Type:

    AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 FirstVPC 10.0.0.0/16 template (YAML形式)
  4. #jawsdays2021 #jawsdays2021_C 24 Infrastructure as Codeとはなにか︖ aws cliで作成する場合 $aws ec2

    create-vpc -- cidr-block 10.0.0.0/16 VPC 10.0.0.0/16 create-vpc.sh (Shell形式)
  5. #jawsdays2021 #jawsdays2021_C VPC 10.0.0.0/16 VPC 10.0.0.0/16 VPC 10.0.0.0/16 25 Infrastructure

    as Codeとはなにか︖ aws cliは処理を定義するため、複数回実⾏した場合、 その処理が毎回実⾏され、そのたびにインフラ側が更新 される $aws ec2 create-vpc -- cidr-block 10.0.0.0/16 VPC 10.0.0.0/16 create-vpc.sh (Shell形式) 実⾏するだけ インフラは増えていく
  6. #jawsdays2021 #jawsdays2021_C 26 CloudFormationの概要 • テンプレートファイルでAWSリソースをプロビジョ ニングするサービス • テンプレートベースで作成〜変更〜削除も可能 •

    CloudFormation⾃体の追加料⾦なし AWS CloudFormation template (JSON/YAML) Stack (リソース) Amazon EC2 AWS Lambda Amazon RDS Amazon Simple Storage Service (S3)
  7. #jawsdays2021 #jawsdays2021_C 27 CloudFormationの概要 • テンプレート • CloudFormationの最も要となる部分 AWSTemplateFormatVersion: '2010-09-09'

    Description: codecommit and ecr Parameters: accountAllias: Type: String accountAlliasLowerCase: Type: String Resources: ecr: Type: AWS::ECR::Repository Properties: RepositoryName: !Sub ${accountAlliasLowerCase}-ecr Outputs: ecr: Value: !GetAtt ecr.Arn Export: Name: ecr • テキストファイルで記述 • JSON/YAML • スタックのリソース状態 を記述 • リソースを記載する順番 は関係なし (CloudFormationが⾃動 的に解決)
  8. #jawsdays2021 #jawsdays2021_C 28 CloudFormationを使う主なメリット • インフラの管理を簡略化 • ⼀度テンプレートからスタックを作成しておくと変更が簡 単。また、スタック単位でのリソース⼀括削除も可能 •

    インフラを簡単に複製可能 • テンプレートを使い回すことで、複数リージョンへのイン フラ展開が簡単 • インフラの変更管理が可能 • テンプレートのテキストファイルをベースにすることで バージョン管理システムによるインフラ管理が可能
  9. #jawsdays2021 #jawsdays2021_C 31 CloudFormation実⾏環境例とPros and Cons 構成 内容 Pros and

    Cons マネジメントコン ソール • AWSのマネジメントコンソールからポ チポチと操作する • 誰でも簡単。特に準備がいらない • 処理の冪等性を担保することが難しい 作業⽤ クライアントPC • インフラ管理者のクライアントPCから コード実⾏ • 柔軟性は⾼いが実⾏環境を統⼀しづらい • 往々にして実⾏コードとリポジトリがずれ る EC2 (SSH接続) • EC2にSSHでログインして、コード実⾏ • IaC実⾏権限の管理が煩雑(SSH秘密鍵と IAMの2重管理) • EC2の料⾦が気になる EC2 (セッションマネー ジャー接続) • EC2にセッションマネージャーでログイ ンして、コード実⾏ • SSH接続よりマシ • EC2の料⾦が気になる リポジトリから ⾃動適⽤ • プルリクエストでコードのテスト • エラーなければ特定ブランチマージから ⾃動デプロイ • アプリケーションデプロイフローの流れ をインフラコードに適⽤ • 実⾏コードがリポジトリと同⼀なのはすご く安⼼ • 構築が⼤変 • 柔軟な運⽤ができない
  10. #jawsdays2021 #jawsdays2021_C 36 CloudFormation実⾏環境例とPros and Cons 構成 内容 Pros and

    Cons マネジメントコン ソール • AWSのマネジメントコンソールからポ チポチと操作する • 誰でも簡単。特に準備がいらない • 処理の冪等性を担保することが難しい 作業⽤ クライアントPC • インフラ管理者のクライアントPCから コード実⾏ • 柔軟性は⾼いが実⾏環境を統⼀しづらい • 往々にして実⾏コードとリポジトリがずれ る EC2 (SSH接続) • EC2にSSHでログインして、コード実⾏ • IaC実⾏権限の管理が煩雑(SSH秘密鍵と IAMの2重管理) • EC2の料⾦が気になる EC2 (セッションマネー ジャー接続) • EC2にセッションマネージャーでログイ ンして、コード実⾏ • SSH接続よりマシ • EC2の料⾦が気になる リポジトリから ⾃動適⽤ • プルリクエストでコードのテスト • エラーなければ特定ブランチマージから ⾃動デプロイ • アプリケーションデプロイフローの流れ をインフラコードに適⽤ • 実⾏コードがリポジトリと同⼀なのはすご く安⼼ • 構築が⼤変 • 柔軟な運⽤ができない
  11. #jawsdays2021 #jawsdays2021_C 37 CloudFormation実⾏環境例とPros and Cons 構成 内容 Pros and

    Cons マネジメントコン ソール • AWSのマネジメントコンソールからポ チポチと操作する • 誰でも簡単。特に準備がいらない • 処理の冪等性を担保することが難しい 作業⽤ クライアントPC • インフラ管理者のクライアントPCから コード実⾏ • 柔軟性は⾼いが実⾏環境を統⼀しづらい • 往々にして実⾏コードとリポジトリがずれ る EC2 (SSH接続) • EC2にSSHでログインして、コード実⾏ • IaC実⾏権限の管理が煩雑(SSH秘密鍵と IAMの2重管理) • EC2の料⾦が気になる EC2 (セッションマネー ジャー接続) • EC2にセッションマネージャーでログイ ンして、コード実⾏ • SSH接続よりマシ • EC2の料⾦が気になる リポジトリから ⾃動適⽤ • プルリクエストでコードのテスト • エラーなければ特定ブランチマージから ⾃動デプロイ • アプリケーションデプロイフローの流れ をインフラコードに適⽤ • 実⾏コードがリポジトリと同⼀なのはすご く安⼼ • 構築が⼤変 • 柔軟な運⽤ができない 皆さんには⾃信をもって ここに踏み込んでもらいたい
  12. #jawsdays2021 #jawsdays2021_C 54 CloudFormation Linter AWS謹製のテンプレート静的解析ツール • 各種エディタのプラグイン豊富 • 122個のルールがデフォルトで組み込まれている

    • Error 101、Worning 21 • カスタムルールの作成も可能 • Dockerfileが⽤意されているのでCI/CDへの組み込 みが容易(公式イメージはなし)
  13. #jawsdays2021 #jawsdays2021_C 55 ルール例(ERROR) • E1001: Basic CloudFormation Template Configuration

    • E1002: Template size limit • E1003: Template description limit • E1004: Template description can only be a string • E1010: GetAtt validation of parameters • E1011: FindInMap validation of configuration • E1012: Check if Refs exist • E1015: GetAz validation of parameters • E1016: ImportValue validation of parameters
  14. #jawsdays2021 #jawsdays2021_C 56 ルール例(WORNING) • W1019: Sub validation of parameters

    • W1020: Sub isn't needed if it doesn't have a variable defined • W2001: Check if Parameters are Used • W2030: Check if parameters have a valid value • W2031: Check if parameters have a valid value based on an allowed pattern • W2501: Check if Password Properties are correctly configured • W2506: Check if ImageId Parameters have the correct type • W2510: Parameter Memory Size attributes should have max and min • W2511: Check IAM Resource Policies syntax • W2531: Check if EOL Lambda Function Runtimes are used
  15. #jawsdays2021 #jawsdays2021_C 58 cfn-lintの利⽤(Dockerfile) FROM python:3.8-alpine RUN pip install cfn-lint

    RUN pip install pydot ENTRYPOINT ["cfn-lint"] CMD ["--help"] • 公式イメージは提供されていないため、⾃分の CI/CDプロセスで使うには⾃前ビルド or 都度pipイ ンストールを実施 • ⾃前ビルドはECR Publicに置くのもあり pipで簡単にインストール可能
  16. #jawsdays2021 #jawsdays2021_C 59 cfn-lintの利⽤(gitlab-ci.yml例) cfn-lint: stage: iac-static-test image: python:3.8-alpine script:

    - pip install --upgrade pip - pip install cfn-lint - pip install pydot - cfn-lint template/*.yml ベースイメージにpython:3.8-alpineを利⽤して、pipインス トール後、cfn-lintを実⾏
  17. #jawsdays2021 #jawsdays2021_C 63 AWS CloudFormation Guard 2020年10⽉にGAされた、AWS謹製のテンプレート解 析アンドセキュリティポリシー評価ツール • 独⾃のポリシー記述⾔語を利⽤し、企業のポリシー

    ガイドラインに反するCloudFormationテンプレー トを排除可能 • デフォルト定義されているルールは無し • 既存のテンプレートからルールセットを作成可能 • GitHubにExampleのルールが⽤意されている
  18. #jawsdays2021 #jawsdays2021_C 67 cfn-guardの利⽤(gitlab-ci.yml例) ベースイメージにubuntu:20.04を利⽤して、wgetからバイ ナリダウンロードして配置して実⾏ cfn-guard: stage: iac-static-test image:

    ubuntu:20.04 script: - apt-get update - apt-get install -y wget - wget https://github.com/aws-cloudformation/cloudformation- guard/releases/download/1.0.0/cfn-guard-linux-1.0.0.tar.gz - tar -xvf cfn-guard-linux-1.0.0.tar.gz - cd ./cfn-guard-linux - ./cfn-guard --version
  19. #jawsdays2021 #jawsdays2021_C 70 選外になったもの • cfn-nag • AWS謹製のテンプレートセキュリティポリシー準拠確認ツール • 以前はよく使われていたようだが、今はCloudFormation

    Guard が上位互換の扱いにみえるのでこちらを使う必要性はなさそう • ポリシーの定義がテンプレートへのメタデータ埋め込み⽅式なの で、正直だいぶ使いづらい • CFripper • Skyscanner社が出している静的解析ツール • セキュリティポリシーを別のルールセットで評価可能 • スター数も多く開発は活発そうでcfn-nagより良さそうだが、こ れもCloudFormation Guardが出てきたので必要なさそう
  20. #jawsdays2021 #jawsdays2021_C 71 CI成果物のアーティファクト格納 CDで利⽤する形態に合わせてアーティファクトを作成する • 通常のCloudFormationの場合 • CloudFormationのテンプレート •

    パラメータ設定ファイル • 設定ファイルはCDの形態によってフォーマットが異なる • SAM(Serverless Application Model)の場合 • Lambdaのコード(zip化されたもの)と、パラメータが アーティファクト⽤に変換されたテンプレート • cloudformation packageコマンドを使うと、そのあたり CloudFormationがよしなにやってくれる
  21. #jawsdays2021 #jawsdays2021_C 85 ②CodeBuildからCLIで実⾏ CodeBuild(その他⼀般的なCI/CDツール)からCLIで実⾏ • Terraformとかでは⼀般的な⽅法 • terraform plan、terraform

    apply • CloudFormationは⾟い • CLI体系が本当にイケてない(createとupdateの使い分けが必 要) • スタック展開の進捗がわからない • deployコマンドもそこまで柔軟ではない • CloudFormationのCDが普及しづらい⼤きな原因はこれだと 思ってる
  22. #jawsdays2021 #jawsdays2021_C 86 ②CodeBuildからCLIで実⾏ CodeBuild(その他⼀般的なCI/CDツール)からCLIで実⾏ • Terraformとかでは⼀般的な⽅法 • terraform plan、terraform

    apply • CloudFormationは⾟い • CLI体系が本当にイケてない(createとupdateの使い分けが必 要) • スタック展開の進捗がわからない • deployコマンドもそこまで柔軟ではない • CloudFormationのCDが普及しづらい⼤きな原因はこれだと思っ てる そんな悩めるあなたに舞い降りた奇跡︕︕
  23. #jawsdays2021 #jawsdays2021_C 89 Rain AWS謹製CloudFormationのCLIツール • 今までのAWS CLIベースのコマンドのつらみをもろもろ 解消してくれる •

    インタラクティブなデプロイが可能 • CFnテンプレートの⽣成ができる • 既存スタックの有無によるコマンド使い分けももちろん 不要 • 削除も簡単 • Go製なので、コンテナ利⽤も超簡単
  24. #jawsdays2021 #jawsdays2021_C 93 CloudFormationのCD実装のPros and Cons ⼿法 Pros Cons ①CodePipelineに

    CloudFormationを 組み込む • 作るものが少なくシンプル に構築できる • 処理の⾒通しが良い • パラメータ内容の動的変更な ど融通が効かせづらい • CodePipelineでしか動かない ②CodeBuildから CLIで実⾏ • マルチなCI/CDプラット フォームで動作可能 (CodeBuild、GitHub Actions、CircleCI、 GitLab CI) • 冪等性が重要な領域に「処 理」を組み込んでしまいがち • 前段の処理結果を受けてパラ メータを変更するなどを過度 にやりだすと、⾒通しが悪く なりCI/CDプロセス保守性が 下がる