Successfully reported this slideshow.

サーバーレスの基本とCI/CD構築 & 運用 〜システムは動いてからが本番だ〜

1,802 views

Published on

Developers.IO 2019 TOKYOで登壇した際の資料です。

https://dev.classmethod.jp/

Published in: Technology
  • Be the first to comment

サーバーレスの基本とCI/CD構築 & 運用 〜システムは動いてからが本番だ〜

  1. 1. サーバーレスの基本と CI/CD構築 & 運⽤ システムは動いてからが本番だ 2019年11⽉1⽇ 藤井元貴
  2. 2. スライドは後で⼊⼿することが出来ますので 発表中の内容をメモする必要はありません。 写真撮影をする場合は フラッシュ・シャッター⾳が出ないようにご配慮ください Attention
  3. 3. #cmdevio #cmdevio3 3 ぜひ、ツイートお願いします!😃 #cmdevio #cmdevio3
  4. 4. #cmdevio #cmdevio3 4 ⾃⼰紹介 藤井 元貴 クラスメソッド株式会社(2019年1⽉〜) CX事業本部‧サーバーサイドエンジニア 前職は主に、組み込み系のエンジニア 変わった資格? 無⼈航空機操縦技能証明証 無⼈航空機安全運⾏管理証明証 ↑⼀般社団法⼈⽇本UAS産業振興協議会(JUIDA)発⾏
  5. 5. 簡単な質問です
  6. 6. #cmdevio #cmdevio3 6 質問1 Lambdaを使ったことは? (プライベート、お仕事問わず) " 🙋
  7. 7. #cmdevio #cmdevio3 7 質問2 構成管理ツールを使ったことは? CloudFormation AWS SAM AWS CDK Serverless Framework など " 🙋
  8. 8. #cmdevio #cmdevio3 8 質問3 CI/CDしてますか? (サーバーレスに限らず) " 🙋
  9. 9. #cmdevio #cmdevio3 9 ちょっと脱線します(昔々あるところに……) プライベートで、スマホアプリを作っています ⽇々データを登録する系(体重みたいな) 機種変更で貯めたデータがリセットされるのツライ…… データ移⾏の仕組みを作りたいけど、 ⾃分で作るの超⼤変そう サーバー⽤意? そもそもAPIってどう作るの? データベースは何をどうするの??
  10. 10. #cmdevio #cmdevio3 10 ちょっと脱線します(昔々あるところに……) AWSのサービスを使えば簡単にできそう、と知る Lambda DynamoDB API Gateway Simple Storage Service (S3)
  11. 11. #cmdevio #cmdevio3 11 ちょっと脱線します(昔々あるところに……) 実際に作れた!!! でも…… 画⾯ポチポチ CI/CDなし 監視?美味しいの? (利⽤頻度:数回/⽉)
  12. 12. #cmdevio #cmdevio3 12 ちょっと脱線します(昔々あるところに……) 実際に作れた!!! でも…… 画⾯ポチポチ CI/CDなし 監視?美味しいの? (利⽤頻度:数回/⽉) 当時の⾃分にとって、 CI/CDで良さそうな情報を ⾒つけられなかった
  13. 13. #cmdevio #cmdevio3 13 ちょっと脱線します(昔々あるところに……) 実際に作れた!!! でも…… 画⾯ポチポチ CI/CDなし 監視?美味しいの? (利⽤頻度:数回/⽉) イイカンジに作れる CloudFormation AWS SAM テストコード CI/CD 監視 今なら
  14. 14. #cmdevio #cmdevio3 14 というわけで、おすすめの⽅ サーバーレスに興味がある サーバーレスでCI/CDをしている / したい サーバーレスで何らかのシステムを 開発‧運⽤している / したい
  15. 15. #cmdevio #cmdevio3 15 ⼤事なこと CI/CDを構築し、⼩さく試して ⾼速に改善を繰り返すサイクルを作る 監視内容を考え、必要な通知を実現する
  16. 16. #cmdevio #cmdevio3 16 ⼤事なこと CI/CDを構築し、⼩さく試して ⾼速に改善を繰り返すサイクルを作る 監視内容を考え、必要な通知を実現する これらに必要なことを、 お話していきます
  17. 17. #cmdevio #cmdevio3 話すこと サーバーレスの基本 サーバーレスの運⽤ CI/CDやってみた 監視と通知、がんばるぞい
  18. 18. #cmdevio #cmdevio3 話すこと サーバーレスの基本 サーバーレスの運⽤ CI/CDやってみた 監視と通知、がんばるぞい
  19. 19. #cmdevio #cmdevio3 サーバーレスの基本 サーバーレスとは よく使うサービス よくある例
  20. 20. #cmdevio #cmdevio3 20 サーバーレスとは Server management less サーバーを意識しない (管理‧運⽤が不要)
  21. 21. #cmdevio #cmdevio3 21 クラウドの良さ サーバー(物理)の導⼊や管理が不要 使いたいときにすぐ使える 電源等の冗⻑化や⼊退出管理などが不要 従量課⾦ 使った時間や量に対して課⾦
  22. 22. #cmdevio #cmdevio3 22 さらに、サーバーレスの良さ OSバージョンアップやセキュリティパッチなどが不要 AWS側が対応してくれる ⾼可⽤性 冗⻑化やスケールアップ/スケールアウトが⾃動 やりたいこと‧作りたいものに注⼒できる サービスを組み合わせれば動く
  23. 23. #cmdevio #cmdevio3 23 サーバーレス開発でやること 利⽤者側 設計‧開発作業 リリース作業 エラー等の監視 クラウド側 サーバー保守 冗⻑化 ログ管理 リトライ処理 こっちに注⼒できる
  24. 24. #cmdevio #cmdevio3 24 サーバーレスで嬉しいこと🥰 「やりたいこと‧作りたいもの」 に注⼒できる
  25. 25. #cmdevio #cmdevio3 25 たとえば WebAPIを作りたい!! <⾃前で作る @ Ruby on Rails> サーバーを⽤意する VPC作る EC2インスタンス⽴てる セキュリティグループとか設定する etc Ruby と Ruby on Railsをインストール コード書く
  26. 26. #cmdevio #cmdevio3 26 たとえば WebAPIを作りたい!! <サーバーレスで作る> API GatewayでWebAPIを作る Lambdaでロジックを書く
  27. 27. #cmdevio #cmdevio3 27 たとえば WebAPIを作りたい!! <サーバーレスで作る> API GatewayでWebAPIを作る Lambdaでロジックを書く コードを書くだけで動く 👍 不要: サーバーの準備 不要: 実⾏環境の導⼊‧設定 不要: 冗⻑化考慮
  28. 28. #cmdevio #cmdevio3 サーバーレスの基本 サーバーレスとは よく使うサービス よくある例
  29. 29. #cmdevio #cmdevio3 29 よく使うサービス KinesisLambda DynamoDB IoT Core CloudFormation API Gateway Simple Storage Service (S3) Cognito And more…
  30. 30. #cmdevio #cmdevio3 30 DynamoDB マネージド型のNoSQLデータベースサービス 単⼀障害点が無い(分散データベース) スケーリングをお任せ 保管時の暗号化 スループット性能に対して課⾦ プロビジョニング(事前に決めた性能) オンデマンド(実際に使った性能)★オススメ ストレージの容量制限が無い
  31. 31. #cmdevio #cmdevio3 31 API Gateway REST API / WebSocket APIを作れる 作成、公開、保守、モニタリング AWSの各サービスに直接、接続可能 API Gateway ⇔ Lambda API Gateway ⇔ DynamoDB API Gateway ⇔ S3 など
  32. 32. #cmdevio #cmdevio3 32 Lambda FaaS(Function as a Service) サーバーレスの中核 任意のコードを実⾏可能な環境 AWS各種サービスとの連携が楽 Input(駆動トリガー) / Output(出⼒先) 安い 使⽤した回数と時間に課⾦ 0.20 USD/100万回 (最初の100万回は無料)
  33. 33. #cmdevio #cmdevio3 33 CloudFormation AWSサービスの管理をテキスト(YAML)で記述 Infrastructure as Code 画⾯ポチポチからの解放(⼀部除く) 複数環境の作成が楽 パラメータを変えるだけ サーバーレスに特化したAWS SAMもある Serverless Application Model (CloudFormationを拡張したもの)
  34. 34. #cmdevio #cmdevio3 サーバーレスの基本 サーバーレスとは よく使うサービス よくある例
  35. 35. #cmdevio #cmdevio3 35 よくある例 IoTデバイスと接続して処理するバックエンド WebAPIとそのバックエンド
  36. 36. #cmdevio #cmdevio3 36 IoTデバイスと接続して処理するバックエンド AWS Lambda Amazon DynamoDBAmazon IoT Core AWS Lambda デバイスからデータを受け取って、担当者に電話 Amazon Connect
  37. 37. #cmdevio #cmdevio3 37 WebAPIとそのバックエンド AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon API Gateway スマホアプリやWebアプリから使われるAPI
  38. 38. #cmdevio #cmdevio3 38 よく使うパターンがAWS公式で紹介 https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/
  39. 39. #cmdevio #cmdevio3 39 よく使うパターンがAWS公式で紹介 https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/ 全16パターン
  40. 40. #cmdevio #cmdevio3 話すこと サーバーレスの基本 サーバーレスの運⽤ CI/CDやってみた 監視と通知、がんばるぞい
  41. 41. #cmdevio #cmdevio3 41 そもそも運⽤とは(本セッションで扱う範囲) システムは作って終わりでは無く、育てていく 新機能の追加 既存機能の改善 不要機能の削除 不具合の修正 また、何らかのトラブルも起こり得る Lambdaのエラー‧同時実⾏数の上限 DynamoDBのキャパシティ不⾜ などなど
  42. 42. #cmdevio #cmdevio3 42 そもそも運⽤とは(本セッションで扱う範囲) 育てるときに、CI/CDがあると良いね! デグレに気づける ⾃動デプロイで楽になる ⼩さく試して⾼速に改善を繰り返すサイクルができる Lambda等のエラーを監視&通知できると良いね! エラーに気づいて対処できる
  43. 43. #cmdevio #cmdevio3 43 サーバーレスの運⽤ 利⽤者側 設計‧開発作業 リリース作業 エラー等の監視 クラウド側 サーバー保守 冗⻑化 ログ管理 リトライ処理 サーバーレスの運⽤
  44. 44. #cmdevio #cmdevio3 44 サーバーレスの運⽤ 利⽤者側 設計‧開発作業 リリース作業 エラー等の監視 クラウド側 サーバー保守 冗⻑化 ログ管理 リトライ処理 サーバーレスの運⽤ <本セッションで扱う範囲> CI/CD エラー等の監視通知
  45. 45. #cmdevio #cmdevio3 45 サーバーレス開発の勘所 https://speakerdeck.com/sinofseven_/sabaresukai-fa-falsekan-suo
  46. 46. #cmdevio #cmdevio3 話すこと サーバーレスの基本 サーバーレスの運⽤ CI/CDやってみた 監視と通知、がんばるぞい
  47. 47. #cmdevio #cmdevio3 47 質問1 「CI/CD」という⾔葉を 聞いたことがある (やってなくてもOK!) " 🙋
  48. 48. #cmdevio #cmdevio3 48 質問2 CI/CDをやっている やってみたい" 🙋
  49. 49. #cmdevio #cmdevio3 CI/CDやってみた CI/CDとは とあるプロジェクトのCI/CDをご紹介 プロジェクト概要 テストコードを書くコツ デプロイとリリース作業の様⼦ 少しでも安全にデプロイする⽅法
  50. 50. #cmdevio #cmdevio3 50 Continuous Integration:継続的インテグレーション いつでも正しく動くようにしておこう CD (Continuous Delivery):継続的デリバリー いつでもデプロイ(リリース)できるように しておこう CI/CDをひとことで
  51. 51. #cmdevio #cmdevio3 51 CI/CDをするために Continuous Integration:継続的インテグレーション いつでも正しく動くようにしておこう → テストコードを書く CD (Continuous Delivery):継続的デリバリー いつでもデプロイ(リリース)できるように しておこう → デプロイを⾃動化する
  52. 52. #cmdevio #cmdevio3 52 CI/CDのイメージ develop master 1. Lambda関数のコードが正しく動くこと 2. 開発環境(AWS)にデプロイできること 3. デプロイしたAPIが正しく動くこと or
  53. 53. #cmdevio #cmdevio3 53 CIの嬉しさ😊 いつでも動く、安⼼感 意図通り動くことを確認できる デグレに気づける 昔書いたコードの期待動作を思い出せる
  54. 54. #cmdevio #cmdevio3 54 CDの嬉しさ😊 テストコードで⾒つけれない不具合に気づける ⼿順ミスによるデプロイ失敗を無くす xxxさんしかできない(知らない)を無くす
  55. 55. #cmdevio #cmdevio3 55 テストコードで⾒つけれない不具合の例 CloudFormationのミス スペルミス、インデント違い、など デプロイ権限の不⾜ IAMのCreate権限が不⾜、など AWSサービスを実際に使って判明する事柄 AWS SDKの使い⽅が違う(ユニットテストはMockでPASS) 必要なリソースの作成漏れ(SNS Topicなど) 実⾏権限の不⾜(DynamoDBに対するRead/Write権限) など
  56. 56. #cmdevio #cmdevio3 CI/CDやってみた CI/CDとは とあるプロジェクトのCI/CDをご紹介 プロジェクト概要 テストコードを書くコツ デプロイとリリース作業の様⼦ 少しでも安全にデプロイする⽅法
  57. 57. #cmdevio #cmdevio3 CI/CDやってみた CI/CDとは とあるプロジェクトのCI/CDをご紹介 プロジェクト概要 テストコードを書くコツ デプロイとリリース作業の様⼦ 少しでも安全にデプロイする⽅法
  58. 58. #cmdevio #cmdevio3 58 プロジェクト概要 環境 API GitHub + CircleCI 数⼗本ある 実証実験フェーズ Lambda 実際に使われている(社外の⽅) Python 3系 + pytest (数⼗本) 毎週⽔曜⽇にリリース(交互) DynamoDB ステージング環境 or 本番環境 約20テーブル 開発⼿法 構成管理 スクラム AWS SAM CloudFormation
  59. 59. #cmdevio #cmdevio3 CI/CDやってみた CI/CDとは とあるプロジェクトのCI/CDをご紹介 プロジェクト概要 テストコードを書くコツ デプロイとリリース作業の様⼦ 少しでも安全にデプロイする⽅法
  60. 60. #cmdevio #cmdevio3 60 テストコードの種類 ユニットテスト Lambda関数のコードに対するテスト Lintも実施する E2Eテスト WebAPIに対するテスト (実際にデプロイしたAPIを叩く)
  61. 61. #cmdevio #cmdevio3 61 ユニットテストのコツ テストしやすいコードを書く メソッド化(処理を分離する) Interfaceを活⽤する Lambdaハンドラーをロジックから分離する
  62. 62. #cmdevio #cmdevio3 62 Lambdaハンドラーをロジックから分離する (例) index.py create.py
  63. 63. #cmdevio #cmdevio3 63 AWSサービスに絡むテストが⼤変😒 DynamoDB や S3に対するCRUD操作 IoT CoreのDevice Shadowに対するRead/Write操作 SNS Topicに対するPublish など
  64. 64. #cmdevio #cmdevio3 64 AWSサービスに絡むテストのやり⽅ その1 Mockを使う その2 Interfaceを活⽤する その3 LocalStackを使う どれかひとつ、ではなく 必要に応じて組み合わせる
  65. 65. #cmdevio #cmdevio3 65 AWSサービスに絡むテストのやり⽅(その1) Mockを使って、AWS SDKのメソッドを 叩いたことにする Python (pytest) → monkeypatch を使う http://doc.pytest.org/en/latest/monkeypatch.html
  66. 66. #cmdevio #cmdevio3 66 Mockを使ってテストする例(対象コード) dynamodb.py app.py Mockを使って ←が ↙を叩いた事にする
  67. 67. #cmdevio #cmdevio3 67 Mockを使ってテストする例(テストコード) test_app.py
  68. 68. #cmdevio #cmdevio3 68 AWSサービスに絡むテストのやり⽅(その2) AWSサービス⽤のInterfaceを定義して使う ‧実際にAWS SDKを使うクラス(処理)を実装 ‧テスト⽤のクラス(処理)を実装
  69. 69. #cmdevio #cmdevio3 69 Interfaceを定義 Pythonなので抽象クラスを使⽤
  70. 70. #cmdevio #cmdevio3 70 Interfaceを実装 本番⽤ テスト⽤
  71. 71. #cmdevio #cmdevio3 71 使う側 本番コード テストコード
  72. 72. #cmdevio #cmdevio3 72 AWSサービスに絡むテストのやり⽅(その3) LocalStackを使う https://github.com/localstack/localstack
  73. 73. #cmdevio #cmdevio3 73 LocalStackで嬉しいこと😊 ローカルでAWSサービスのテストができる DynamoDBやS3に対するCRUD操作 SNS Topicに対するPublish AWS SDKのI/Fをそのまま使える デプロイ前に実⾏時エラーに気づける ローカルテスト⽤のコードが不要
  74. 74. #cmdevio #cmdevio3 74 LocalStackの対応サービス(Free) API Gateway Elasticsearch Service Kinesis SES DynamoDB Route 53 DynamoDB Stream CloudFormation Elasticsearch CloudWatch S3 SSM Firehose SecretsManager Lambda StepFunctions SNS CloudWatch Logs SQS EventBridge (CloudWatch Events) Redshift STS IAM EC2
  75. 75. #cmdevio #cmdevio3 75 LocalStackの使⽤例 本番コード (DynamoDB アクセス⽤) 本番コード (DynamoDB 使⽤側) テストコード 本番コードに テストの都合が不要
  76. 76. #cmdevio #cmdevio3 76 E2Eテストの観点 HTTPステータスコード 不正なリクエスト時、4xxになっている? 正常なリクエスト時、200になっている? 応答内容(Responseパラメータ) 期待通りの応答内容になっている?
  77. 77. #cmdevio #cmdevio3 77 E2Eテストの⽅法 (Python + pytest) 単体テストと同じようにコードを書いてます データの準備 DynamoDBにテスト⽤のデータを格納する テスト実⾏ デプロイしたAPIを叩いてテストする(requestsライブラリ) データのお⽚付け DynamoDBのテスト⽤データを削除する
  78. 78. #cmdevio #cmdevio3 CI/CDやってみた CI/CDとは とあるプロジェクトのCI/CDをご紹介 プロジェクト概要 テストコードを書くコツ デプロイとリリース作業の様⼦ 少しでも安全にデプロイする⽅法
  79. 79. #cmdevio #cmdevio3 79 環境ごとにAWSアカウントを使⽤💪 アカウント内の制限を気にしなくて良い Lmabdaの同時実⾏数 IoTのエンドポイント リソース名の重複(ただしS3バケット名は注意) 何かあっても、どの環境かすぐ分かる エラーや障害の発⽣ 不正アクセス 間違って異なる環境を触るミスを防ぐ hoge-fuga-dev hoge-fuga-prod ← が並んでいると怖い……😱
  80. 80. #cmdevio #cmdevio3 80 AWSの環境(とあるプロジェクト) 名称 内容 デプロイタイミング 開発環境 開発⽤(⾃由) 開発時 - git push時 - プルリクOK時 結合環境 POレビュー⽤ 開発時 - レビュー準備OK時 ステージング環境 検証⽤ リリース作業時 本番環境 本番⽤ リリース作業時
  81. 81. #cmdevio #cmdevio3 81 Gitのブランチ運⽤とデプロイの関係 feature/1234 master v1.2.0 masterブランチ & featureブランチ 開発環境 → 結合環境 タグ(リリース) ステージング環境 → 本番環境
  82. 82. #cmdevio #cmdevio3 82 Gitのブランチ運⽤とデプロイの関係 feature/1234 master v1.2.0 masterブランチ & featureブランチ 開発環境 → 結合環境 タグ(リリース) ステージング環境 → 本番環境 CircleCIの Approve機能を活⽤してJobを⽌める
  83. 83. #cmdevio #cmdevio3 83 Gitのブランチ運⽤とデプロイの関係 feature/1234 master v1.2.0 masterブランチ & featureブランチ 開発環境 → 結合環境 タグ(リリース) ステージング環境 → 本番環境 CircleCIの Approve機能を活⽤
  84. 84. #cmdevio #cmdevio3 84 リリース作業は、毎週⽔曜に実施(交互) V1.3.0 v1.2.0 ステージング環境 本番環境 11/1 11/8 ステージング環境 本番環境 11/15 11/22 $ git tag v1.2.0 $ git push origin v1.2.0 $ git tag v1.3.0 $ git push origin v1.3.0
  85. 85. #cmdevio #cmdevio3 85 リリース作業は、毎週⽔曜に実施(交互) V1.3.0 v1.2.0 ステージング環境 本番環境 11/1 11/8 ステージング環境 本番環境 11/15 11/22 CircleCIの Approve機能を活⽤してJobを⽌める $ git tag v1.2.0 $ git push origin v1.2.0 $ git tag v1.3.0 $ git push origin v1.3.0
  86. 86. #cmdevio #cmdevio3 86 CircleCIのワークフロー例 開発環境 & 結合環境 ステージング環境 & 本番環境
  87. 87. #cmdevio #cmdevio3 87 CircleCIのワークフローの流れ デプロイ環境の準備 ビルド (AWS SAM) Lint & 単体テスト デプロイ E2Eテスト Python仮想環境の準備 AWS-CLI等のインストール Python仮想環境のキャッシュ保存(CircleCI) AssumeRole SwaggerファイルをS3にコピー デプロイ作業
  88. 88. #cmdevio #cmdevio3 88 AWS SAM + CircleCIの例(参考) https://dev.classmethod.jp/cloud/aws/aws-sam-auto-deploy-for-circleci/
  89. 89. #cmdevio #cmdevio3 CI/CDやってみた CI/CDとは とあるプロジェクトのCI/CDをご紹介 プロジェクト概要 テストコードを書くコツ デプロイとリリース作業の様⼦ 少しでも安全にデプロイする⽅法
  90. 90. 90 IAMポリシー AdministratorAccess を使って デプロイしていませんか?
  91. 91. #cmdevio #cmdevio3 91 IAMユーザのアクセスキー流出のリスク🥶 強いEC2で仮想通貨のマイニング データベースの内容を盗られる など https://dev.classmethod.jp/cloud/aws/accesskey-leak/
  92. 92. #cmdevio #cmdevio3 92 少しでも安全にデプロイする⽅法 AssumeRole を活⽤する 本来持っていない権限を⼀時的に得られる機能 何もできない…… ⼀時的に権限ちょうだい! ありがとう! デプロイ⽤の権限(CreateXxx / etc)
  93. 93. #cmdevio #cmdevio3 93 AssumeRoleに必要なモノ IAMロール (IAMユーザ⽤) IAMロール (CloudFormation⽤) IAMユーザ IAMポリシー IAMユーザ AWSにアクセスするユーザ IAMロール(IAMユーザ⽤) CloudFormationを操作できるロール IAMロール(CloudFormation⽤) 実際のAWSサービスを操作できるロール IAMポリシー IAMポリシー
  94. 94. #cmdevio #cmdevio3 94 IAMユーザ IAMユーザ このIAMユーザーで、アクセスキー(下記)を払い出す ‧アクセスキーID ‧シークレットアクセスキー
  95. 95. #cmdevio #cmdevio3 95 IAMポリシー IAMポリシー 指定のRoleにAssumeRoleできる 権限のみ有する
  96. 96. #cmdevio #cmdevio3 96 このIAMユーザは、AssumeRole以外できない IAMポリシー IAMユーザ アクセスキー CloudFormation $ aws cloudformation list-stacks An error occurred (AccessDenied) 権限不⾜
  97. 97. #cmdevio #cmdevio3 97 IAMユーザ⽤のIAMロールとIAMポリシー デプロイ作業に必要な権限のみを持つ ‧CloudFormationの操作 ‧S3バケットの作成、オブジェクトのアップロード など IAMロール (IAMユーザ⽤) IAMポリシー ↑は⼀部のみ紹介 IAMユーザがAssumeRoleするIAMロール
  98. 98. #cmdevio #cmdevio3 98 AssumeRoleし、指定IAMロールとして振る舞う AssumeRole アクセスキー (⼀時的) アクセスキー IAMロール (IAMユーザ⽤) IAMユーザ IAMポリシー IAMポリシー IAMロール(IAMユーザ⽤)に AssumeRoleする ↓ IAMロール(IAMユーザ⽤)として振る舞う ためのアクセスキー(⼀時的)を取得し使⽤する
  99. 99. #cmdevio #cmdevio3 99 AssumeRoleし、指定IAMロールとして振る舞う AssumeRole アクセスキー (⼀時的) アクセスキー IAMロール (IAMユーザ⽤) IAMユーザ IAMポリシー IAMポリシー IAMロール(IAMユーザ⽤)に AssumeRoleする ↓ IAMロール(IAMユーザ⽤)として振る舞う ためのアクセスキー(⼀時的)を取得し使⽤する $ aws sts assume-role ¥ --role-arn arn:aws:iam::1234567890:role/deploy-iam-sample-deploy-role-for-user ¥ --role-session-name deploy-test ¥ --duration-seconds 900 { "Credentials": { "AccessKeyId": "xxxxxx", "SecretAccessKey": "yyyyyy", "SessionToken": "zzzzzz", "Expiration": "2019-09-06T12:31:37Z" }, "AssumedRoleUser": { "AssumedRoleId": "hoge:deploy-test", "Arn": "arn:aws:sts::1234567890:assumed-role/deploy-iam-sample-deploy-role-for- user/deploy-test" } }
  100. 100. #cmdevio #cmdevio3 100 AssumeRole アクセスキー (⼀時的) アクセスキー IAMロール (IAMユーザ⽤) IAMユーザ IAMポリシー IAMポリシー CloudFormation $ aws cloudformation list-stacks { …… } AssumeRole先が持つ権限の操作は成功する
  101. 101. #cmdevio #cmdevio3 101 CloudFormation⽤のIAMロールとIAMポリシー CloudFormationがデプロイするときに 必要となる権限を付与 IAMロール (CloudFormation⽤) IAMポリシー CloudFormationがAssumeRoleするIAMロール
  102. 102. #cmdevio #cmdevio3 102 AssumeRoleを活⽤したデプロイ例 AWS Identity and Access Management (IAM) AssumeRole アクセスキー (⼀時的) CloudFormation アクセスキー IAMロール (IAMユーザ⽤) IAMロール (CloudFormation⽤) IAMユーザ IAMポリシー デプロイよろしく〜 IAMロール(CloudFormation⽤)を使ってね IAMポリシー IAMポリシー
  103. 103. #cmdevio #cmdevio3 103 AssumeRoleを活⽤したデプロイ例 AWS Identity and Access Management (IAM) AssumeRole アクセスキー (⼀時的) CloudFormation アクセスキー IAMロール (IAMユーザ⽤) IAMロール (CloudFormation⽤) IAMユーザ IAMポリシー デプロイよろしく〜 IAMロール(CloudFormation⽤)を使ってね IAMポリシー IAMポリシー sam deploy ¥ --template-file packaged.yaml ¥ --stack-name Deploy-Iam-Sample-SAM-App ¥ --capabilities CAPABILITY_IAM ¥ --role-arn arn:aws:iam::1234567890:role/deploy-iam-sample-deploy-role-for-cloudformationç
  104. 104. #cmdevio #cmdevio3 104 AssumeRoleを活⽤すれば IAMユーザは、AssumeRoleできる権限のみ保有 アクセスキーが流出しても、事実上なにもできない AssumeRoleするための情報は、外部から推測されにくい IAMロールARNが必要 AssumeRoleされたとしても、最低限の権限しかない 実際のデプロイはCloudFormation⽤のIAMロールのため アクセスキーには有効期限がある(15分〜12時間) IAMロール(CloudFormation⽤)は、CloudFormationのみ使える 各サービスに対する強い権限を持つが、そもそもユーザは使えない
  105. 105. #cmdevio #cmdevio3 105 いますぐやろう、AssumeRole https://dev.classmethod.jp/cloud/aws/assume-role-deploy-iam-user-and-role/
  106. 106. #cmdevio #cmdevio3 話すこと サーバーレスの基本 サーバーレスの運⽤ CI/CDやってみた 監視と通知、がんばるぞい
  107. 107. #cmdevio #cmdevio3 運⽤と監視、がんばるぞい とある監視通知の例 とあるプロジェクトの運⽤監視をご紹介 理想と現実 監視体制と通知の例 監視と通知の仕組み
  108. 108. #cmdevio #cmdevio3 108 こんなことあったら、どうですか?🤔 ⽇曜⽇の深夜4時…… Lambdaでエラー発⽣ (異常終了)
  109. 109. #cmdevio #cmdevio3 109 こんなことあったら、どうですか?🤔 ⽇曜⽇の深夜4時…… Lambdaでエラー発⽣ (異常終了) リトライで成功してた (⾮同期Lambda)
  110. 110. #cmdevio #cmdevio3 110 こんなことあったら、どうですか?🤔 ⽇曜⽇の深夜4時…… Lambdaでエラー発⽣ (異常終了) リトライで成功してた (⾮同期Lambda)
  111. 111. #cmdevio #cmdevio3 111 遠い昔、遥か彼⽅の銀河系で……📽 よっしゃ、 Lambdaのエラーを 通知したろ!! CloudWatch
  112. 112. #cmdevio #cmdevio3 112 遠い昔、遥か彼⽅の銀河系で……📽 あれ、このエラー通知して、 誰がなぜ嬉しいんだ??? CloudWatch
  113. 113. #cmdevio #cmdevio3 運⽤と監視、がんばるぞい とある監視通知の例 とあるプロジェクトの運⽤監視をご紹介 理想と現実 監視体制と通知の例 監視と通知の仕組み
  114. 114. #cmdevio #cmdevio3 運⽤と監視、がんばるぞい とある監視通知の例 とあるプロジェクトの運⽤監視をご紹介 理想と現実 監視体制と通知の例 監視と通知の仕組み
  115. 115. #cmdevio #cmdevio3 115 エラー監視の理想と現実 理想 現実(私の携わるプロジェクト) 知りたいこと 「何を知りたいのか」を事前に検討する ‧運⽤者の視点: 異常はないか? ‧開発者の視点: Lambdaにエラー発⽣してないか? ‧利⽤者の視点: 期待通り使えるか? など しっかり検討できてない (検知できる事のうち、必要そうな やつ) 検知⽅法&条件 「知りたいこと」を検知する⽅法や条件を個別に考える ‧Lambdaのエラーが1分で1回発⽣ ‧Lambdaのエラーが5分で5回発⽣ ‧ログに特定の⽂字列が1回出現 など Lambdaのエラー(タイムアウト等 も含む) Lambdaのログに「Error」を含む DynamoDBのスロットリング発⽣ など 通知条件 即時対応が必要:すぐ通知 即時対応が不要:すぐ通知(即時とは区別する) まとめて通知(1⽇1回など) 検知したもの全部を即通知 通知⽅法 内容(重要度)や時間帯に合わせる ‧業務中 :Slack、メール、電話 ‧休⽇夜間:Slack、メール 緊急時は休⽇夜間でも電話 など Slackのみ
  116. 116. #cmdevio #cmdevio3 116 今プロジェクトの監視設計はざっくり…… 通知の条件は無い(常に即通知@Slack) ⾄急対応が必要な事象 急がないけど、対応が必要な事象 「その通知があっても、⾒守るしか無い……」な事象 ↑を意識せず、Lambdaのエラーや DynamoDBのエラー等を単純に通知している 背景:実証実験フェーズなので細かく気にしてない 営業時間内の対応でOKだから 「今使えない」よりも「あのとき使えてなかった」を重視
  117. 117. #cmdevio #cmdevio3 運⽤と監視、がんばるぞい とある監視通知の例 とあるプロジェクトの運⽤監視をご紹介 理想と現実 監視体制と通知の例 監視と通知の仕組み
  118. 118. #cmdevio #cmdevio3 118 こんな感じで、監視してます Lambda等のエラーは、Slackに通知される Slack通知以外もある(POから連絡等) ⽇替わりで⾒張り当番がある(業務時間内) ⾒張り当番がSlackの通知を確認し、 必要に応じて不具合報告チャンネルに報告する 暫定対策: 必要なら実施 根本対策: 必要ならチケット作成
  119. 119. #cmdevio #cmdevio3 119 実際にあったエラー通知の例 Lambda関数のタイムアウト(60秒) 通常は数秒で終わる DynamoDBからデータ取得待ちだった Lambda関数の実⾏時エラー データ0件が存在した(考慮漏れ)
  120. 120. #cmdevio #cmdevio3 運⽤と監視、がんばるぞい とある監視通知の例 とあるプロジェクトの運⽤監視をご紹介 理想と現実 監視体制と通知の例 監視と通知の仕組み
  121. 121. #cmdevio #cmdevio3 121 監視対象 Lambda 単純なエラー(CloudWatchメトリクス) タイムアウト、メモリ不⾜(特定キーワードのログ出現) Lambda以外のAWSサービス CloudWatchメトリクスを活⽤ APIヘルスチェック 動いてるかどうか
  122. 122. #cmdevio #cmdevio3 122 Lambdaのエラー監視&通知 Kinesis DataStream Lambda (同期実⾏) CloudWatch Logs Lambda (⾮同期実⾏) Lambda (Slack通知@Kinesis⽤) サブスクリプション フィルター (Error等を含むログ) SNS Topic Lambda (Slack通知@DLQ⽤) DLQ
  123. 123. #cmdevio #cmdevio3 123 Lambda(⾮同期実⾏)の通知例
  124. 124. #cmdevio #cmdevio3 124 Lambda(同期実⾏)の通知例
  125. 125. #cmdevio #cmdevio3 125 LambdaログにRequestIDがないとき
  126. 126. #cmdevio #cmdevio3 126 LambdaログにRequestIDがあるとき
  127. 127. #cmdevio #cmdevio3 127 LogFormatterを⾃作する場合 Lambda開始時に、RequestIDを覚えておく ⾃作のLogFormatterで、RequestIDを含める
  128. 128. #cmdevio #cmdevio3 128 Lambd以外のエラー監視&通知(その1) CloudWatch Alarm Lambda (Slack通知) SNS Topic
  129. 129. #cmdevio #cmdevio3 129 Lambda以外のエラー監視&通知(その2) SaaSを活⽤
  130. 130. #cmdevio #cmdevio3 130 APIヘルスチェック Route 53 のヘルスチェックを利⽤
  131. 131. まとめ
  132. 132. #cmdevio #cmdevio3 132 システムは動いてからが本番だ CI/CDを構築し、⼩さく試して ⾼速に改善を繰り返すサイクルを作る 監視内容を考え、必要な通知を実現する これらに必要なことを、 お話しました
  133. 133. #cmdevio #cmdevio3 133 参考 CircleCIとGitHubでAWS SAMのサーバーレスアプリを⾃動デプロイしてみた (開発環境 & 本番環境) https://dev.classmethod.jp/cloud/aws/aws-sam-auto-deploy-for-circleci/ [AssumeRole] アクセスキーが流出しても被害が最⼩限になるIAMユーザでCloudFormationにデプ ロイする⽅法 https://dev.classmethod.jp/cloud/aws/assume-role-deploy-iam-user-and-role/ 【⼩ネタ】CircleCIのManual Approvalを利⽤したシンプルなブランチ/タグ運⽤ https://dev.classmethod.jp/ci/simple-branch-tag-operations-with-circleci-manual-approval/ 【実録】アクセスキー流出、攻撃者のとった⾏動とその対策 https://dev.classmethod.jp/cloud/aws/accesskey-leak/ サーバーレス開発の勘所 https://speakerdeck.com/sinofseven_/sabaresukai-fa-falsekan-suo
  134. 134. 134

×
Save this presentation