Slide 1

Slide 1 text

CircleCIで実現する AWSのテスト技法 と Policy as Code 2019.10.01 CircleCI User MeetUp #7

Slide 2

Slide 2 text

淡路⼤輔 / INTEC @gee0awa 好きな技術 Serverless / React Native

Slide 3

Slide 3 text

Policy as Code?

Slide 4

Slide 4 text

の前に Infrastructure as Code

Slide 5

Slide 5 text

Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ deploy Cloudformationによる例 deploy テスト環境 本番環境

Slide 6

Slide 6 text

インフラの継続的デリバリ ・デプロイするまでインフラのテストができない ・誤ったセキュリティグループを作ってしまった ・Cloudformationの内部のエラーに遭遇しがち 課題

Slide 7

Slide 7 text

Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy テスト環境

Slide 8

Slide 8 text

Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy テスト環境 デプロイの前にどうやってテストをするのか

Slide 9

Slide 9 text

Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy テスト環境 デプロイの前にどうやってテストをするのか

Slide 10

Slide 10 text

https://github.com/aws-cloudformation/cfn-python-lint

Slide 11

Slide 11 text

※今回の資料ではcfn-lintの説明には不要であるため、キャッシュの設定などは記述していません .circleci/config.yml

Slide 12

Slide 12 text

VSCode上での実⾏イメージ

Slide 13

Slide 13 text

⾜りないルールがあればPullRequestを出そう

Slide 14

Slide 14 text

cfn-python-lint だけでは不⼗分 ・誤ったセキュリティグループを作らないようにしたい ・iam:*などの権限の強いポリシーを作らせたくない ・リソースの説明⽂やタグを必ず付けさせたい チームでの取り決め(ポリシー)をどう担保するか

Slide 15

Slide 15 text

Policy as Code コードが決められたポリシーに従っているかテストする

Slide 16

Slide 16 text

YAMLをテストする

Slide 17

Slide 17 text

YAMLを静的構⽂解析する テストコード

Slide 18

Slide 18 text

取り決め(ポリシー)が 守られているかテストする

Slide 19

Slide 19 text

jestなどのテストフレームワークを 使⽤してテンプレートのポリシーチェックをする .circleci/config.yml

Slide 20

Slide 20 text

Policy as Code ・誤ったセキュリティグループを作らない ・iam:*などの権限の強いポリシーを作らせない ・リソースの説明⽂やタグを必ず付けさせる

Slide 21

Slide 21 text

Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy テスト環境 デプロイの前にどうやってテストをするのか

Slide 22

Slide 22 text

AWSのリソースを使⽤した アプリケーションをどうテストするか

Slide 23

Slide 23 text

"84αʔϏεΛ࢖༻ͨ͠ߏ੒ྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service A Service B Upload File Event hook Notification

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Docker で LocalStack を⽴ち上げる endpoint-urlを指定すれば aws cliでもアクセス可能

Slide 28

Slide 28 text

"84αʔϏεΛ࢖༻ͨ͠ߏ੒ྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service A Service B Upload File Event hook Notification

Slide 29

Slide 29 text

"84αʔϏεΛ࢖༻ͨ͠ߏ੒ྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service A Service B Upload File Event hook Notification ファイルアップロードする サービスクラスに対する テストを書いてみる

Slide 30

Slide 30 text

アップロード/ダウンロードする FileServiceクラスを実装する

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

アンチパターン プロダクションコードに テスト⽤の条件を混在させない

Slide 33

Slide 33 text

Dependency Injection できる作りにしておく Good Parts

Slide 34

Slide 34 text

S3 Client Object を Dependency Injectionする テストコード S3 Client Object の endpoint を LocalStackに向けてFakeする

Slide 35

Slide 35 text

ローカルでの実⾏例

Slide 36

Slide 36 text

これを CircleCI で実現する

Slide 37

Slide 37 text

docker-compose で LocalStackを ⽴ち上げるのでホストマシンに VM を使⽤する .circleci/config.yml

Slide 38

Slide 38 text

LocalStack の起動 .circleci/config.yml

Slide 39

Slide 39 text

あとは普通にテスト .circleci/config.yml

Slide 40

Slide 40 text

"84αʔϏεΛ࢖༻ͨ͠ߏ੒ྫ Lambda はどうテストするのか? 特に S3 Put Object のトリガーで 発⽕するような構成の場合 AWS Lambda DynamoDB SNS S3 Bucket Service A Service B Upload File Event hook Notification アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

処理本体を別モジュール化 Before After

Slide 43

Slide 43 text

Lambdaをテスト可能にする Before After 処理本体を別モジュール化

Slide 44

Slide 44 text

別モジュール化した処理本体をテストする テストコード

Slide 45

Slide 45 text

Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy テスト環境 どうやってデプロイするか

Slide 46

Slide 46 text

"84αʔϏεΛ࢖༻ͨ͠ߏ੒ྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service A Service B Upload File Event hook Notification これらのリソースを1つの テンプレートでデプロイする

Slide 47

Slide 47 text

ブランチごとにスタックを作成 PullRequest(ブランチ)ごとにAWS上にデプロイすれば 実際のAWS環境上でもUnitTestを実⾏できる。

Slide 48

Slide 48 text

インフラの継続的デリバリ lint test deploy まとめ cfn-python-lintを使う / Policy as Code でYAMLをテストする LocalStack を使う / Lambdaは処理を外部モジュール化する ブランチごとにデプロイできるようにテンプレートを記述する

Slide 49

Slide 49 text

ご静聴ありがとうございました!