rights reserved. 解決策: AWS Developer Tools M O N ITO R D E P LO Y BU ILD & TE S T S O U RC E / ARTIF AC T AU TH O R AWS Cloud9 AWS IDE Toolkits AWS SDKs AWS X-Ray AWS CodeCommit AWS CodeDeploy AWS CodeBuild Amazon CloudWatch AWS CodePipeline AWS CodeArtifact Amazon ECR & ECR Public Amazon DevOps Guru Amazon CodeGuru M O D E L AWS CloudFormation AWS Cloud Development Kit (AWS CDK) AWS Serverless Application Model (SAM) AWS Config AWS Managed Service for Grafana AWS Managed Service for Prometheus
rights reserved. DevOps はモダンアプリ構築の基礎 Resiliency and security Source/artifact management Infrastructure as code Observability CI/CD Two Pizza Teams AWS Developer Tools ⽂化 Culture 実践 Practice ツール Tools まずは インフラ構築を 始めよう ジェイク
rights reserved. Infrastructure as Code (IaC) とは︖ 機械が処理できる定義ファイル(またはコード)によって インフラストラクチャの管理やプロビジョニングを⾏うプロセス I N F R A S T R U C T U R E A S C O D E 13 コードであるべき状態を宣⾔ インフラストラクチャの状態を確認し ⽬的の状態と異なっていたら ⾃動で API を呼び出して状態を⼀致させる インフラストラクチャが ⽬的の状態に収束する コードを渡して実⾏ AWS CloudFormation の例 AWS CloudFormation IaC サービス YAML または JSON ファイル CloudFormation テンプレート BlockPublicAcls: true ... S3 Bucket リソース • S3 バケットがなかったら作成 • 状態が違っていたら更新 • 状態が同じなら何もしない etc. ⾃動で API を呼び出し ⾮公開の S3 バケットが1つ 存在すること
rights reserved. IaC のメリット: ⾃動化とリソース管理の⼀貫性 I N F R A S T R U C T U R E A S C O D E 必要に応じて変更を 以前のバージョンに ロールバック ベストプラクティス の共有と適⽤ 信頼できる唯⼀の情報源 としてバージョン管理 リポジトリを使⽤
rights reserved. 新しい環境の作成コストを削減 I N F R A S T R U C T U R E A S C O D E Amazon API Gateway Amazon EventBridge Amazon DynamoDB Amazon SQS AWS Lambda AWS Lambda AWS Lambda Amazon S3 AWS Lambda Amazon SNS AWS Cloud エマ AWS CDK で 作っておいたよ
rights reserved. 新しい環境の作成コストを削減 I N F R A S T R U C T U R E A S C O D E Test Staging Production Jake's sandbox account Emma's sandbox account David's sandbox account
rights reserved. AWS Cloud Development Kit (AWS CDK) I N F R A S T R U C T U R E A S C O D E AWS CDK Meeting developers where they are Cloud Resources 使い慣れたプログラミング⾔語で クラウドリソースを定義できる オープンソースのフレームワーク 開発者体験を改善 • アプリと同じ⾔語で記述でき ドメイン固有⾔語の習得が不要 • プログラミング⾔語の表現⼒と IDE の機能を活⽤ • 静的解析とユニットテスト アプリ全体をコードで定義 • クラウドリソースだけでなく AWS Lambda 関数のコードや コンテナイメージなど アプリ全体をまとめて管理 • CI/CD パイプラインを⾃動構築 • 複数の AWS アカウントに またがる環境を管理 ⾼レベルの抽象化 • 複雑な設定を抽象化し コード量と学習コストを削減 • いつでも抽象化から抜け出して 個別の設定にアクセス可能 • ベストプラクティスに基づく デフォルト値と設定を提供 • チームの構成パターンや ガードレールを共有・再利⽤
rights reserved. AWS CDK でアプリ全体をコードで定義 A W S C D K の 哲 学 Shared services バージョン管理リポジトリ インフラストラクチャ アプリケーション コード Test Staging Production CDK App Emma's sandbox cdk deploy git push CI/CD パイプライン CI/CD
rights reserved. AWS CDK の概念 I N F R A S T R U C T U R E A S C O D E https://docs.aws.amazon.com/cdk/v2/guide/home.html • アプリケーション全体 • 複数のAWSアカウント、リージョンに またがることが可能 App • CloudFormation スタックに対応 • デプロイ可能な最⼩単位 Stack • CDKの最も基本的なビルディングブロック • 1つまたは複数のAWSリソースを表現 • ユーザーにより定義・配布が可能 Construct
rights reserved. AWS Constructs Library AWS CDK が標準で提供する Construct のライブラリ Patterns (L3) • 複数のリソースを含む⼀般的な構成パターンを事前に定義したもの • aws-ecs-patterns.LoadBalancedFargateService など High-level constructs (L2) • デフォルト値や便利なメソッドを定義したAWSリソースを表すクラス • 例)クラス s3 は メソッド s3.Bucket.addLifeCycleRule() を持つ Low-level constructs (L1) • CloudFormationリソースおよびプロパティと1:1で対応(⾃動⽣成される) • CfnXXX という名前 (例︓s3.CfnBucket は AWS::S3::Bucket を意味) • すべてのプロパティを明⽰的に設定する必要がある I N F R A S T R U C T U R E A S C O D E 抽象化 レベル
rights reserved. エスケープハッチ (代替⼿段) A) 使いたい機能が CloudFormation で利⽤できるが、L2コンストラクトがない場合 § CfnBucket や CfnRole など、Cfn で始まる L1 コンストラクトを使う § 対応する L1 コンストラクトがなければ、cdk.CfnResource を使う (CFnテンプレートとほぼ同等の記述) B) L2 コンストラクトの機能が⾜りない場合 § construct.node.defaultChild で L1 コンストラクトを取得し、プロパティを変更する C) 使いたい機能 がCloudFormation で利⽤できない場合 § カスタムリソースを作成する § AWS の API を呼び出すシンプルなカスタムリソースは AwsCustomResource コンストラクトを 使⽤することで、Lambda 関数のコードを記述することなく 簡単に作成可能 I N F R A S T R U C T U R E A S C O D E * https://docs.aws.amazon.com/cdk/v2/guide/cfn_layer.html
rights reserved. Assets でアプリケーションをデプロイ I N F R A S T R U C T U R E A S C O D E Amazon S3 - aws_s3_deployment モジュール new BucketDeployment(this, 'WebAppDeploy', { destinationBucket: s3Bucket!, distribution: cloudFrontWebDistribution, // invalidation sources: [ // Deploy a React frontend app Source.asset('webapp/dashboard/build'), ], }); TypeScript • ローカル zip ファイル • ローカルディレクトリ • テキスト / JSON データ (デプロイ時に挿⼊可能) AWS Lambda - aws_lambda モジュール new NodejsFunction(this, 'Handler', { entry: 'lambda/metrics-handler.ts', handler: 'get', }); TypeScript • ローカルのソースコードをバンドル • aws_lambda_nodejs モジュールの場合は esbuild で TypeScript をトランスパイル&バンドル Amazon ECS - aws_ecs モジュール const taskDefinition = new FargateTaskDefinition(this, 'Def', { cpu: 256, memoryLimitMiB: 512, }); taskDefinition.addContainer('Recorder', { image: ContainerImage.fromAsset('container/recorder'), }); TypeScript • ローカルの Dockerfile から コンテナイメージを作成し Amazon ECR リポジトリに push してデプロイ Amazon ECR
rights reserved. AWS CDK でのスナップショットテスト • CloudFormation テンプレートの出⼒を⽐較して、意図しない変更がないことを確認 • 実環境へのアクセス不要。実装コストも低いので、採⽤しやすい⼿法 C I / C D 実⾏結果 テストコード スナップショット(Git にコミットする)
rights reserved. AWS CDK による AWS X-Ray の有効化 O B S E R V A B I L I T Y new RestApi(this, 'RestAPI', { deployOptions: { tracingEnabled: true, }, }); TypeScript new NodejsFunction(this, 'Handler', { entry: 'lambda/metrics-handler.ts', handler: 'get', tracing: Tracing.ACTIVE, }); TypeScript new StateMachine(this, 'MyStateMachine', { definition: Chain.start(new Pass(this, 'Pass')), tracingEnabled: true, }); TypeScript Amazon API Gateway AWS Lambda AWS Step Functions ※ Lambda 関数内からの AWS SDK 呼び出しなどのキャプチャは AWS X-Ray SDK を使⽤した設定が必要 個々のコンポーネントだけでなく ユーザー体験をベースにアプリ全体をモニタリング
rights reserved. 開発のアジリティを下げないセキュリティ • 発⾒的ガードレールを中⼼として、未然に防ぐより逸脱を検知することを重視 • CI/CD と AWS CDK による⾃動化とテンプレートの共有 R E S I L I E N C Y A N D S E C U R I T Y Production Emma's sandbox cdk deploy git push Pipeline バージョン管理 コードレビュー • ⼈による最後の検査 • セキュリティだけでなく ロールバック可能か アラームは適切かなども 確認 発⾒的ガードレール • アラートと⾃動修復 • AWS Security Hub • AWS Config • Amazon Inspector 予防的ガードレール • パイプラインにのみ 変更を許可 • AWS IAM • AWS WAF アカウント分離 • リスク評価に応じた 実験環境 (sandbox) AWS CDK 静的解析 (SAST) • GitHub Code Scanning • cdk-nag • Trivy • SonarQube 動的解析 (DAST) • OWASP Zap • Burp Suite • Nikto • Fiddler
rights reserved. Baseline Environment on AWS (BLEA) AWS のセキュリティベストプラクティスを実装した オープンソースのサンプルテンプレート 特徴 基本的なセキュリティを設定するテンプレートと ゲストシステムのサンプルテンプレートを提供 AWSのセキュリティベストプラクティスに準拠 AWS Cloud Development Kit (CDK) コード 参考となるスニペット、コメント、リファレンスを豊富に記載 チームによる⻑期的な利⽤を想定 CDK 標準ライブラリのみを使ったシンプルな実装 利⽤者が理解しやすいよう過度な作り込みを避ける R E S I L I E N C Y A N D S E C U R I T Y https://github.com/aws-samples/baseline-environment-on-aws ガバナンス ベース (基本的なセキュリティ) ゲストシステム サンプル AWS Account BLEA が提供するテンプレート CDK CDK
rights reserved. 静的解析の実装例 (cdk-nag) R E S I L I E N C Y A N D S E C U R I T Y CloudFormation: cfn-nag, cfn-guard など Terraform: Checkov, tfsec など 参考: AWS Cloud Development Kit と cdk-nag で アプリケーションのセキュリティとコンプライアンスを管理する 簡単かつ継続的に脆弱性を監視
rights reserved. Emma's sandbox コードの変更をすばやくクラウドに反映 cdk deploy --hotswap / cdk watch • Lambda 関数、ECS コンテナ、Step Functions ステートマシンなどを CloudFormation を経由せず API で直接デプロイすることで素早く反映 https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/README.md#hotswap-deployments-for-faster-development • CloudFormation スタックとドリフトが発⽣するため、開発⽤途でのみ使⽤ • cdk watch 実⾏中はスタックに含まれる CloudWatch Logs の更新を⾃動的に受信 (tail) • ローカルマシンにエミュレーター等を導⼊しなくても、クラウドで直接開発できる D E V E L O P E R E X P E R I E N C E $ cdk watch --all 'watch' is observing directory 'lambda' for changes ... Detected change to 'lambda/handler.ts' (type: change). Triggering 'cdk deploy' ... ✨ Deployment time: 11.48s ... [/aws/lambda/SNSHandler-SNSHandler00XXXX] 17:06:32 2022- 08-17T08:06:32.634Z INFO Hello world! Console . ├── bin │ └── sns-handler.ts ├── lib │ └── sns-handler-stack.ts └── lambda └── handler.ts 変更を検知 ⾃動でデプロイ CloudWatch Logs の更新を受信 Lambda Function CloudWatch Logs