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

AWSのテスト技法とPolicy as Code / aws-testing-techniques-and-policy-as-a-code

g-awa
October 01, 2019

AWSのテスト技法とPolicy as Code / aws-testing-techniques-and-policy-as-a-code

g-awa

October 01, 2019
Tweet

More Decks by g-awa

Other Decks in Technology

Transcript

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

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

  3. Policy as Code?

  4. の前に Infrastructure as Code

  5. Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ deploy Cloudformationによる例 deploy

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

  7. Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy

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

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

    テスト環境 デプロイの前にどうやってテストをするのか
  10. https://github.com/aws-cloudformation/cfn-python-lint

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

  12. VSCode上での実⾏イメージ

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

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

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

  16. YAMLをテストする

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

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

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

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

  21. Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy

    テスト環境 デプロイの前にどうやってテストをするのか
  22. AWSのリソースを使⽤した アプリケーションをどうテストするか

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

    A Service B Upload File Event hook Notification
  24. None
  25. None
  26. None
  27. Docker で LocalStack を⽴ち上げる endpoint-urlを指定すれば aws cliでもアクセス可能

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

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

    A Service B Upload File Event hook Notification ファイルアップロードする サービスクラスに対する テストを書いてみる
  30. アップロード/ダウンロードする FileServiceクラスを実装する

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

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

  34. S3 Client Object を Dependency Injectionする テストコード S3 Client Object

    の endpoint を LocalStackに向けてFakeする
  35. ローカルでの実⾏例

  36. これを CircleCI で実現する

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

  38. LocalStack の起動 .circleci/config.yml

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

  40. "84αʔϏεΛ࢖༻ͨ͠ߏ੒ྫ Lambda はどうテストするのか? 特に S3 Put Object のトリガーで 発⽕するような構成の場合 AWS

    Lambda DynamoDB SNS S3 Bucket Service A Service B Upload File Event hook Notification アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する
  41. None
  42. 処理本体を別モジュール化 Before After

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

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

  45. Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy

    テスト環境 どうやってデプロイするか
  46. "84αʔϏεΛ࢖༻ͨ͠ߏ੒ྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service

    A Service B Upload File Event hook Notification これらのリソースを1つの テンプレートでデプロイする
  47. ブランチごとにスタックを作成 PullRequest(ブランチ)ごとにAWS上にデプロイすれば 実際のAWS環境上でもUnitTestを実⾏できる。

  48. インフラの継続的デリバリ lint test deploy まとめ cfn-python-lintを使う / Policy as Code

    でYAMLをテストする LocalStack を使う / Lambdaは処理を外部モジュール化する ブランチごとにデプロイできるようにテンプレートを記述する
  49. ご静聴ありがとうございました!