Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
AWSのテスト技法とPolicy as Code / aws-testing-techniques-and-policy-as-a-code
g-awa
October 01, 2019
Technology
4
930
AWSのテスト技法とPolicy as Code / aws-testing-techniques-and-policy-as-a-code
g-awa
October 01, 2019
Tweet
Share
More Decks by g-awa
See All by g-awa
Effective AppSync ~ Serverless Framework を使用した AppSync の実践的な開発方法とテスト戦略 ~ / Effective AppSync
gawa
0
880
サーバレス時代の負荷テスト戦略 / Load testing strategy for serverless
gawa
18
4k
オレをCI/CDする / my ci cd practice
gawa
6
2.3k
Other Decks in Technology
See All in Technology
WebLogic Server for OCI 概要
oracle4engineer
PRO
3
840
re:Invent re:Cap / AWS Lambda Updates
bulbulpaul
1
140
lt53
98_justdoit
0
110
データベースの発表には RDBMS 以外もありますよ
maroon1st
0
230
“Do you have a virtual router?” Discuss how to use virtual routers
line_developers
PRO
0
480
AI Services 概要 / AI Services overview
oracle4engineer
PRO
0
160
インフラ技術基礎勉強会 開催概要
toru_kubota
0
130
MoT/コネヒト/Kanmu が語るプロダクト開発xデータ分析 - 分析から機械学習システムの開発まで一人で複数ロールを担う大変さ
masatakashiwagi
2
570
マイクロサービス宣言から8年 振り返りとこれから / Eight Years After the Microservices Declaration A Look Back and A Look Ahead
eisuke
2
130
チケットNFTの仕組み
sbtechnight
0
330
目指せCoverage100%! AutoScale環境におけるSavings Plans購入戦略 / JAWS-UG_SRE_Coverage
taishin
0
270
ECテックカンファレンス2023 EC事業部のモバイル開発2023
tatsumi0000
0
160
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
52
4.3k
Designing the Hi-DPI Web
ddemaree
273
32k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
32
6.7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
239
19k
Music & Morning Musume
bryan
36
4.6k
The World Runs on Bad Software
bkeepers
PRO
59
5.7k
Adopting Sorbet at Scale
ufuk
65
7.8k
Scaling GitHub
holman
453
140k
Design by the Numbers
sachag
271
18k
JazzCon 2018 Closing Keynote - Leadership for the Reluctant Leader
reverentgeek
175
9.1k
Raft: Consensus for Rubyists
vanstee
130
5.7k
In The Pink: A Labor of Love
frogandcode
132
21k
Transcript
CircleCIで実現する AWSのテスト技法 と Policy as Code 2019.10.01 CircleCI User MeetUp
#7
淡路⼤輔 / INTEC @gee0awa 好きな技術 Serverless / React Native
Policy as Code?
の前に Infrastructure as Code
Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ deploy Cloudformationによる例 deploy
テスト環境 本番環境
インフラの継続的デリバリ ・デプロイするまでインフラのテストができない ・誤ったセキュリティグループを作ってしまった ・Cloudformationの内部のエラーに遭遇しがち 課題
Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy
テスト環境
Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy
テスト環境 デプロイの前にどうやってテストをするのか
Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy
テスト環境 デプロイの前にどうやってテストをするのか
https://github.com/aws-cloudformation/cfn-python-lint
※今回の資料ではcfn-lintの説明には不要であるため、キャッシュの設定などは記述していません .circleci/config.yml
VSCode上での実⾏イメージ
⾜りないルールがあればPullRequestを出そう
cfn-python-lint だけでは不⼗分 ・誤ったセキュリティグループを作らないようにしたい ・iam:*などの権限の強いポリシーを作らせたくない ・リソースの説明⽂やタグを必ず付けさせたい チームでの取り決め(ポリシー)をどう担保するか
Policy as Code コードが決められたポリシーに従っているかテストする
YAMLをテストする
YAMLを静的構⽂解析する テストコード
取り決め(ポリシー)が 守られているかテストする
jestなどのテストフレームワークを 使⽤してテンプレートのポリシーチェックをする .circleci/config.yml
Policy as Code ・誤ったセキュリティグループを作らない ・iam:*などの権限の強いポリシーを作らせない ・リソースの説明⽂やタグを必ず付けさせる
Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy
テスト環境 デプロイの前にどうやってテストをするのか
AWSのリソースを使⽤した アプリケーションをどうテストするか
"84αʔϏεΛ༻ͨ͠ߏྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service
A Service B Upload File Event hook Notification
None
None
None
Docker で LocalStack を⽴ち上げる endpoint-urlを指定すれば aws cliでもアクセス可能
"84αʔϏεΛ༻ͨ͠ߏྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service
A Service B Upload File Event hook Notification
"84αʔϏεΛ༻ͨ͠ߏྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service
A Service B Upload File Event hook Notification ファイルアップロードする サービスクラスに対する テストを書いてみる
アップロード/ダウンロードする FileServiceクラスを実装する
None
アンチパターン プロダクションコードに テスト⽤の条件を混在させない
Dependency Injection できる作りにしておく Good Parts
S3 Client Object を Dependency Injectionする テストコード S3 Client Object
の endpoint を LocalStackに向けてFakeする
ローカルでの実⾏例
これを CircleCI で実現する
docker-compose で LocalStackを ⽴ち上げるのでホストマシンに VM を使⽤する .circleci/config.yml
LocalStack の起動 .circleci/config.yml
あとは普通にテスト .circleci/config.yml
"84αʔϏεΛ༻ͨ͠ߏྫ Lambda はどうテストするのか? 特に S3 Put Object のトリガーで 発⽕するような構成の場合 AWS
Lambda DynamoDB SNS S3 Bucket Service A Service B Upload File Event hook Notification アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する
None
処理本体を別モジュール化 Before After
Lambdaをテスト可能にする Before After 処理本体を別モジュール化
別モジュール化した処理本体をテストする テストコード
Github Create Stack Developer commits CloudFormation インフラの継続的デリバリ lint test deploy
テスト環境 どうやってデプロイするか
"84αʔϏεΛ༻ͨ͠ߏྫ アップロードされたファイルサイズが50MB以上の場合 DynamoDBにファイル名を保存し、SNSを介して別サービスに通知する AWS Lambda DynamoDB SNS S3 Bucket Service
A Service B Upload File Event hook Notification これらのリソースを1つの テンプレートでデプロイする
ブランチごとにスタックを作成 PullRequest(ブランチ)ごとにAWS上にデプロイすれば 実際のAWS環境上でもUnitTestを実⾏できる。
インフラの継続的デリバリ lint test deploy まとめ cfn-python-lintを使う / Policy as Code
でYAMLをテストする LocalStack を使う / Lambdaは処理を外部モジュール化する ブランチごとにデプロイできるようにテンプレートを記述する
ご静聴ありがとうございました!