10.8K Views
October 09, 21
スライド概要
AWS CloudFormation 入門 +オマケのハンズオン
[email protected] 2021.10.09
AWS CloudFormation 入門 +オマケのハンズオン [email protected] 2021.10.09
Infrastructure as code (IaC) CloudFormation (CFn) ハンズオン:CFnを使ってS3バケットを作成する
Infrastructure as code (IaC)
Infrastructure as code (IaC) • DevOpsの流れで、サービスコードだけでなく、 クラウドインフラもコードとして管理しよう! • サーバーや仮想ネットワークの準備、 Serverless環境などの用意を自動化
Infrastructure as code (IaC) • デプロイ速度の向上:人的コストが削減される • デプロイに人為的ミスが減る:デプロイ作業の品質向上 • 必須の設定の見落としが減る:セキュリティの向上 • 環境を維持せず使うときだけデプロイして、 終わったらリソースを削除:運用コストの削減 • テンプレート化と再利用 • インシデント発生時の解析用環境の再現
Infrastructure as code (IaC) • IaCは、構成管理ツールを使って実現する • 冪等性(べきとうせい)が必須: • 何度実行しても最終的に同じ結果になる • 更新後は更新があった部分だけを変更する
CloudFormation (CFn)
CloudFormation (CFn) • AWSが用意している構成管理ツール • AWSの管理コンソールで設定可能なものは自動化 • 無料で使える (保管用のS3、動作インスタンスの使用料はかかる) • “CloudFormation”で”Cloud Fromation”ではない
CloudFormation (CFn) • 特徴 • YAMLかJSONで構成データを引き渡す • IAMロールで実行権限を制御 • 失敗したら自動でロールバックする • 手動で変更された部分との差分検知 (ドリフト検出) • バージョン管理ができる • 実行結果をCloudTrailに吐くことができる
CloudFormation (CFn) • 欠点 • CFnに対応していないサービスもある (Organizationなど) • CFnを実行時の安全のために権限の分離も必要 (IAMロールの作成) • DBは用意できるが、テーブル作成やデータ投入はできない • IaaS上のサービスデプロイはできない • 初回のみならやる方法もあるが、更新に使えないので無意味 • Ansibleなど他のツールを使うべき
CloudFormation (CFn) •YAMLかJSONで構成データを書く • AWS resource and property types reference - AWS CloudFormation • https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/awstemplate-resource-type-ref.html ※ 英語で表示すること。日本語だとリストが表示されない • Asia Pacific (Tokyo) Region - AWS CloudFormation • https://docs.aws.amazon.com/ja̲jp/AWSCloudFormation/latest/UserGuide/ cfn-sample-templates-ap-northeast-1.html ※ テンプレートは一部のみしか提供されていない
CloudFormation (CFn) • リファレンスやテンプレートはあるが、 設定する項目数が多く、AWS側の追加や変化もある ので手書きは死ぬ • 例) AWS::S3::Bucket - AWS CloudFormation • https://docs.aws.amazon.com/AWSCloudFormation/ latest/UserGuide/aws-properties-s3-bucket.html
CloudFormation (CFn) Type: AWS::S3::Bucket Properties: AccelerateConfiguration: AccelerateConfiguration AccessControl: String AnalyticsConfigurations: - AnalyticsConfiguration BucketEncryption: BucketEncryption BucketName: String CorsConfiguration: CorsConfiguration IntelligentTieringConfigurations: - IntelligentTieringConfiguration InventoryConfigurations: - InventoryConfiguration LifecycleConfiguration: LifecycleConfiguration LoggingConfiguration: LoggingConfiguration MetricsConfigurations: ReplicationConfiguration: ReplicationConfiguration Tags: - Tag VersioningConfiguration: VersioningConfiguration WebsiteConfiguration: WebsiteConfiguration - MetricsConfiguration NotificationConfiguration: NotificationConfiguration ObjectLockConfiguration: ObjectLockConfiguration ObjectLockEnabled: Boolean OwnershipControls: OwnershipControls PublicAccessBlockConfiguration: PublicAccessBlockConfiguration
CloudFormation (CFn) • 何かツールを使ってテンプレートを作るのが妥当 • AWSが用意しているCFn作成ツール ”CloudFormer” も あるが開発は途絶中 • “Former2” のような3rd Party製のツールもある • Serverless環境には、”Serverless Framework” を使う と便利
CloudFormation (CFn) •Former2 • AWS環境だけでなく他のクラウドも同じツールで使えることもある • デプロイ済みの既存環境から設定を再現することもできる • 設定の取り込みには、デプロイ権限を付与したIAMのアクセスキーとシークレ ットが必要 • Webサービスとしての利用もできるが、 アクセスキーとシークレットの引き渡しが必要でセキュリティの懸念あり • ローカルで構築もできる。dockerなどを使用すると便利に使用できる
ハンズオン: CFnを使ってS3バケットを作成する
ハンズオン:CFnを使ってS3バケットを作成する • mk̲s3buket.ymlを用意し、BucketNameに独自のバケット名を指定する • CFnを実行してバケットを作成する • 手動でバケットを削除して、ドリフト検出してみる • 手動でバケットを作成して、ドリフト検出してみる • テンプレートを更新して新しいCFnスタックを実行する • CFnスタックを削除する
ハンズオン:CFnを使ってS3バケットを作成する mk̲s3buket.ymlを用意し、BucketNameに独自のバケット名を指定する • mk̲s3buket.yml を”テキストエディタ”や”メモ帳”などで作成しておく AWSTemplateFormatVersion: 2010-09-09 Resources: S3BucketForRedirect: Type: AWS::S3::Bucket Properties: BucketName: <バケット名> ←<バケット名>を決めて入力 S3バケット名なので、全世界で一意、英子文字のみ
AWSTemplateFormatVersion: '2010-09-09'
Description: buckets for storing.
Metadata:
'AWS::CloudFormation::Interface':
ParameterGroups:
- Label:
default: 'Storage'
Parameters:
- BucketName
Parameters:
BucketName:
Description: 'The name of the bucket to store the data in. If left blank, a bucket name will be generated.'
Type: String
Default: ''
Conditions:
HasBucket: !Not [!Equals [!Ref BucketName, '']]
Resources:
DataBucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !If [HasBucket, !Ref BucketName, !Ref 'AWS::NoValue']
AccessControl: Private
VersioningConfiguration:
Status: Enabled
PublicAccessBlockConfiguration
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: 'AES256'
CorsConfiguration:
CorsRules:
- AllowedHeaders:
- '*'
AllowedMethods:
- 'GET'
- 'PUT'
AllowedOrigins:
- '*'
Outputs:
DataBucket:
Description: 'Name of the bucket'
Value: !Ref DataBucket
Export:
Name: !Sub '${AWS::StackName}-BucketName'
ハンズオン:CFnを使ってS3バケットを作成する
mk̲s3buket.ymlを用意し、BucketNameに独自のバケット名を指定する
• mk̲s3buket.yml
• ちゃんと書くと結構長くなる
• たかだかS3バケットの作成だけど
細かく見ると深い…
ハンズオン:CFnを使ってS3バケットを作成する CFnを実行してバケットを作成する • 管理コンソールからCloudFormationへ移動し、CFnスタックを作成する •
YAMLがアップロードされるS3 URL →
↑ 本来は厳密に必要な権限のみ設定する
ハンズオン:CFnを使ってS3バケットを作成する CFnを実行してバケットを作成する 裏ではCFn実行用のインスタンスが動作している
ハンズオン:CFnを使ってS3バケットを作成する CFnを実行してバケットを作成する • ステイタス完了の確認
ハンズオン:CFnを使ってS3バケットを作成する CFnを実行してバケットを作成する • 失敗するとロールバックされる表示例
ハンズオン:CFnを使ってS3バケットを作成する CFnを実行してバケットを作成する • イベント表示の確認
ハンズオン:CFnを使ってS3バケットを作成する CFnを実行してバケットを作成する • S3の管理コンソールを開いて、バケットが作成されているのを確認する
ハンズオン:CFnを使ってS3バケットを作成する 手動でバケットを削除して、ドリフト検出してみる ① • ドリフトの検出(手 動で変更された部分 の検知)はできるが 自動修正はできない ②
ハンズオン:CFnを使ってS3バケットを作成する 手動でバケットを作成して、ドリフト検出してみる
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する • テンプレートを変更しないで更新すると、途中でエラーになる。
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する • テンプレートは直接編集できる
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する ファイルはアップロード済み → あとは新規作成時と同じ
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する
ハンズオン:CFnを使ってS3バケットを作成する テンプレートを更新して新しいCFnスタックを実行する
ハンズオン:CFnを使ってS3バケットを作成する CFnスタックを削除する
ハンズオン:CFnを使ってS3バケットを作成する CFnスタックを削除する
ハンズオン:CFnを使ってS3バケットを作成する CFnスタックを削除する
ハンズオン:CFnを使ってS3バケットを作成する CFnスタックを削除する CFnスタックで作成したS3バケットは削除済み →