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の次のステップで参考になりそうなサイト
www.slideshare.net