codeシリーズを使ってCloudFormationの静的解析を凄く小さく始める

CFnのCI/CDパターンはいろいろあったりするのだけど、いきなり見たって分からんことも多い。 codeシリーズは触ったことなかったので、ひとまず小さく使って理解するを進めようということでcodecommit、codebuild、codepipelineを使って小さく静的解析してみた。

codecommitの設定

1.codecommitのレポジトリ作成

適当に「cfn-lint-demo」とでもつけてレポジトリ作成。 ここは一瞬で終わります。

2.IAMの権限確認

利用するIAMユーザに以下の権限相当のものがなければ付与する。

AWSCodeCommitPowerUser

ここも一瞬で終わります。

3.gitの認証情報の設定

colenするときに必要な認証情報の発行しておきます。

権限付与したIAMユーザの「認証情報」タブの下の方にある 「AWS CodeCommit の HTTPS Git 認証情報」からgitの認証情報を作成して控えておきます。

4.codecommitのレポジトリを git clone

ローカルからCodeCommitのリモートレポジトリをcolne。

git init
git clone

実行すると、認証情報を確認されるので、先程取得した認証情報を入力。

ここまででcolne完了しているが、ブランチ作成されていないと、codebuildの設定が出来ないので「readme.md」でも適当に作成して、リモートレポジトリにpushしておく。

これでcodecommitの設定はおわり。

codebuildの設定

 1.ビルドプロジェクトの作成

codebuildのビルドプロジェクトの作成を押下し、ちゃきちゃき進めていく。

注意が必要そうな点だけ記載。ほかはデフォルト設定で進んでOK。

○ソース

  • リポジトリは先程作成したものを設定

  • ブランチはMasterを指定。

○環境

  • オペレーティングシステムはどっちでもいいが、今回はAmazonLinux2を選択。

  • ランタイムはスタンダードでOK。(後で設定ファイル内で設定します)

ビルドプロジェクトの設定はこれで完了。

2.buildspec.yamlの準備

ローカルレポジトリで以下の内容を記載したファイル名「buildspec.yaml」を作成し、リモートレポジトリへpush

version: 0.2
phases:
  install:
    runtime-versions:
      python: 3.7
    commands:
      - pip install --upgrade pip
      - pip install cfn-lint --user
      - cfn-lint -v
  build:
    commands:
      - cfn-lint --template *.yaml

ファイルで実行している内容としては、ランタイムをpythonに指定して、cfn-lintをインストールして、レポジトリ内のyamlに対してcfn-lintを実行。

CodePipelineの設定

1.パイプラインの作成

パイプラインの作成。先程作成したcodecommit、codebuildを連携させる。

○ソース

  • ソースプロバイダーはAWS CodeCommitを選択し、レポジトリは先程つくったもの、ブランチはMaster

○構築する

  • プロバイダーを構築はcodebuildを選択し、プロジェクト名には先程の作成したものを選択

○デプロイ

  • 今回はスキップ

動作確認

ローカルで以下を記載した「cfn.yaml」を作成し、リモートレポジトリ(codecommitのレポジトリ)へpushする。

※IAMのCFnリファレンスの記載例

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  RootRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
  RolePolicies:
    Type: "AWS::IAM::Policy"
    Properties:
      PolicyName: "root"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Action: "*"
            Resource: "*"
      Roles:
        -
          Ref: "RootRole"
  RootInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      Path: "/"
      Roles:
        -
          Ref: "RootRole"

CodePipelineのダッシュボードから動作を確認できる。

codecommit側はpushが成功すれば、成功と表示され、 CodeBuild側はlintのチェックが問題なければ、成功と表示され、エラー吐いてれば失敗と表示される。

今回は成功するはずなので、失敗も見てみたかったら、適当に一行目とかを削除して再pushしてみたら失敗する。

まとめ

動かしてみていろいろわかってきた。

CFnのCICDの次のステップで参考になりそうなサイト

dev.classmethod.jp

aws.amazon.com

aws.amazon.com

www.slideshare.net