IaC事始め
Infrastructure as Code
やってみる?
AWS Div. Taishi Kajiwara
2Developers.IO 2019 FUKUOKA
この資料は、
■Developers.IO 2019 FUKUOKA
IaC事始め 〜Infrastructure as Codeやってみる?~]
の登壇資料です
スライドは後で入手することが出来ますので
発表中の内容をメモする必要はありません。
写真撮影をする場合は
フラッシュ・シャッター音が出ないようにご配慮ください
自己紹介
• AWS事業本部 コンサルティング部
ソリューションアーキテクト
• 福岡オフィス
• 好きなサービス(Codeシリーズ, DeepRacer)
梶原大使(@ambasad)
本日話すこと 5
IaCって何?
IaCやってみる?
•Cloud Formation
IaCの今後
•AWS CDK
本日話さないこと(ちょっとは話すかも) 6
- Terraform
- CloudFormation
- マクロ
- CDKの詳細解説
7
GOAL 8
IaCって何?
→ IaCをやりたくなる
IaCもうやってるよ!
→ テクニック、ヒント
IaC って何?
Wikipedia 10
Infrastructure as Code(IaC) はコンピューティング・インフラ
(プロセス、ベアメタルサーバー、仮想サーバーなど)の構成管
理・機械処理可能な定義ファイルの設定・プロビジョニングを自動
化するプロセスである。
https://ja.wikipedia.org/wiki/Infrastructure_as_Code
手作業 11
• EC2インスタンスを作成するとき
CLI / Script 12
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-subnets-commands-example.html
• AWS CLI を使用して IPv4 VPC とサブネットを作成する
ステップ 1: VPC とサブネットを作成する
$ aws ec2 create-vpc --cidr-block 10.0.0.0/16
ステップ2: サブネットをパブリックにします。
$ aws ec2 create-internet-gateway
$ aws ec2 attach-internet-gateway --vpc-id vpc-2f09a348 --
$ internet-gateway-id igw-1ff7a07b
ステップ 3: サブネット内にインスタンスを起動する
….
課題 13
• 手作業によるヒューマンエラー
• 属人化
• ドキュメント不足
• 再利用できない
• 依存関係がわからない
• 不要になった際のリソースの消し忘れ
ー> 同じ構成のインフラが構築できない
ー> 引き継げない
14
Infrastructure as Code
どこからIaC? 15
Code
•コードの記載
Version
Control
•コードの管理
Code Review
•コードの更新確認
deploy
•リソースの作成、更新
ここまでやれば 16
•自動化(リソース作成)
•レビュー/テストの実施
•再利用可能
•依存関係の明確化
•不要リソースの削除
•コスト減
•構築速度改善
課題解決+α
17
デメリット
デメリット 18
デメリット ツールの習熟が必要 CloudFormation
Terraform
Ansible etc..
ツールがサポートしていな
いリソース、プロパティが
ある
新しいサービス
細かい設定
検証作業が必要
(でもこれはポチポチよりはまし)
プログラムミス
予期しないリソース変更
完全な自動化
まではちょっと大変
自動化環境
の環境構築の自動化
19
IaC 事始め
AWS 20
Code
•コードの記載
Version
Control
•コードの管理
Code Review
•コードのレビュー
Integrage
•リソースの作成(更新)
Code
•CloudFormation
Version
Control
•CodeCommit
•CloudFormation
Code Review
•CodePipeline(確認)
•CloudFormation
Integrage
•CodePipeline/CodeBuild
->CloudFormation
21
AWS CloudFormation
AWS CloudFormation 22
https://d1.awsstatic.com/webinars/jp/pdf/services/20181128-AWS-BlackBelt-CloudFormation.pdf
サポートされている AWS リソースタイプ(一部) 23
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
Alexa Skill AmazonMQ
Amplify
Console
API Gateway App Mesh
AppStream
2.0
AppSync Athena
AWS Auto
Scaling
Amazon EC2
Auto Scaling
AWS Backup
AWS Batch AWS Budgets
Certificate
Manager
AWS Cloud9
CloudFormatio
n
CloudFront
AWS Cloud
Map
CloudTrail CloudWatch CodeBuild CodeCommit
CodeDeploy CodePipeline CodeStar
Amazon
Cognito
Config
AWS Data
Pipeline
DAX
Directory
Service
DLM DMS
Amazon
DocumentDB
DynamoDB EC2 Amazon ECR ECS EFS EKS ElastiCache Elasticsearch
Elastic
Beanstalk
Elastic Load
Balancing
Amazon EMR
FSx GameLift AWS Glue GuardDuty IAM Inspector IoT
Amazon
Kinesis
KinesisAnalyti
cs
Amazon
Kinesis Data
Firehose
KMS
LakeFormatio
n
Lambda
ManagedBlock
chain
MediaLive MediaStore MSK
Amazon
Neptune
OpsWorks Pinpoint PinpointEmail QLDB
RAM RDS
Amazon
Redshift
RoboMaker Route 53 Amazon S3
Amazon
SageMaker
Secrets
Manager
Service
Catalog
SecurityHub SES
Amazon
SimpleDB
Amazon SNS Amazon SQS
Step
Functions
Systems
Manager
AWS SFTP WAF WorkSpaces
24
https://d1.awsstatic.com/webinars/jp/pdf/services/20181128-AWS-BlackBelt-CloudFormation.pdf
25
Hello CloudFormation
26
やってみる
3行テンプレート 27
Resources:
S3Bucket:
Type: AWS::S3::Bucket
YAML
1行テンプレート 28
{"Resources":{"S3Bucket":{"Type":"AWS::S3::Bucket"}}}
JSON
スタックの作成 29
https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks?filteringText=&filteringStatus=active&viewNested=true&hideStacks=false
スタックの作成 30
デザイナーで表示 31
テンプレートの検証
スタックの作成 32
スタックの作成 33
34
35
スタックの作成 36
スタックの作成 37
スタックの作成 38
スタックの作成 39
スタックの作成 40
44
更新してみる
テンプレート更新 45
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: mys3bcuket-q6eqw
VersioningConfiguration:
Status: Suspended
YAML
バケット名
バージョニング:無効
置換がTrue の場合はリソースが置換されます
削除&再作成
54
設定を手で勝手に変えてみた
56
設定変更検出してみた
スタックの作成 59
62
ちょっとコードっぽくしてみる
63
https://d1.awsstatic.com/webinars/jp/pdf/services/20181128-AWS-BlackBelt-CloudFormation.pdf
テンプレート更新 64
AWSTemplateFormatVersion: 2010-09-09
Description: S3 Bucket Create
Parameters:
BucketName:
Type: String
AllowedPattern: "[A-Za-z0-9-]+"
Description: Enter BuckeName
Versioning:
Type: String
Default: "Disabled"
AllowedValues: ["Enabled", "Disabled"]
Description: Enter Versioning Enable
Mappings:
VersioningMap:
"Enabled":
"VersioningStatus": "Enabled"
"Disabled":
"VersioningStatus": "Suspended"
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub '${BucketName}-${AWS::AccountId}'
VersioningConfiguration:
Status: !FindInMap [ VersioningMap, !Ref Versioning, VersioningStatus]
YAML
テンプレート更新(前半部分) 65
AWSTemplateFormatVersion: 2010-09-09
Description: S3 Bucket Create
Parameters:
BucketName:
Type: String
AllowedPattern: "[A-Za-z0-9-]+"
Description: Enter BuckeName
Versioning:
Type: String
Default: "Disabled"
AllowedValues: ["Enabled", "Disabled"]
Description: Enter Versioning Enable
YAML
バケット名を入力できるように
バージョニング有無を選択でき
るように
テンプレート更新(後半部分) 66
Mappings:
VersioningMap:
"Enabled":
"VersioningStatus": "Enabled"
"Disabled":
"VersioningStatus": "Suspended“
Resources:
S3Bucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
Properties:
BucketName: !Sub '${BucketName}-${AWS::AccountId}'
VersioningConfiguration:
Status: !FindInMap [ VersioningMap, !Ref Versioning, VersioningStatus]
YAML
バージョニングの有無を変換
入力した値を使用する
アカウントIDを追加してみる
Mapした値を使用
74
コンソールの手作業もやめたい
コンソールの手作業もやめたい 75
•テンプレートをコードとして扱う
•リポジトリに登録
•コミットを検出
•テンプレートのチェック
•スタックを作成/更新
CI/CDの導入
76
うちのCFnでかいんだけど
うちのCFnでかいんだけど 77
https://d1.awsstatic.com/webinars/jp/pdf/services/20181128-AWS-BlackBelt-CloudFormation.pdf
78
CloudFormationのかゆいところ
かゆいところ 79
- CloudFormation
- ツールがサポートしていないリソースがあるとき
- 外部のリソースを使うとき
- 繰り返し
- 条件分岐
- マルチリージョンで複製したい
80
これはやめとけ
81
- IaCで管理していない既存の環境をCloudFormationで更新する
82
- IaCで管理していない環境をCloudFormationで更新する
のではなく、クラウドの利点を生かして、
サクッと新しい環境を作成して、切り替えましょう
- 既存の環境を参考にCloudFormationで新規作成してIaCで管理する
83
テンプレートサンプル紹介
AWS 公式サンプルテンプレート 84
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest
/UserGuide/cfn-sample-templates.html
awslabs 85
https://github.com/awslabs/aws-cloudformation-templates
Developers.IO CloudFormation 特集 86
https://dev.classmethod.jp/referencecat/aws-cloudformation/
CloudFormation一撃 87
https://dev.classmethod.jp/cloud/aws/
cloudformation-guardduty-lambda-sns-
publish/
https://dev.classmethod.jp/cloud/aws/
codepipeline-s3-deploy-cfn-web/
88
IaCの今後(※願望含む)
IaCのアプローチ (Wikipedia) 89
宣言型プログラミング(機能的)、命令型プログラミング(手続き的)、とインテリジェント(環境
認識)の3つのIaCアプローチがある。それらの違いは「何」「どのように」と「なぜ」の違いと同じ
である。[3]
宣言型プログラミング(機能的)は「何」
最終的なターゲット設定が何であるべきかに焦点を当てている。
•目的の様子(所望の状態?)を定義すると、システムはその様子を達成するために必要な何かを実行
する。
命令型プログラミング(手続き的)は「どのように」
最終的なターゲット設定を満たすために、インフラがどのように変化すべきかに焦点を当てている。
•目的の様子で終了するために、適切な順序で実行する必要があるコマンドを定義する。
インテリジェント(環境認識)は「なぜ」
同じインフラストラクチャで実行されている複数のアプリケーションの全ての相互関係と依存性を考
慮し、最終的なターゲット設定が、特定の方法による理由に焦点を当てている。
•相互依存(共依存)アプリケーションに影響を与えないように、システムは起こる必要がある何かを
処理する前に、目的の状態を決定する。
環境を意識した状態がIaCの次世代である。 https://ja.wikipedia.org/wiki/Infrastructure_as_Code
直近 90
- CloudFormation
- (ここは願望なのでトークオンリー)
- CloudFormer (β)
- Roadmap
https://github.com/aws-cloudformation/aws-cloudformation-coverage-roadmap/projects/1
91
- Roadmap
https://github.com/aws-cloudformation/aws-cloudformation-coverage-roadmap/projects/1
92
- AWS CDK
- AWS CDK自体はTypeScriptで実装
- .Net, Java(β)などで記述、呼び出せる。
- CFnに比べ記述が少なくて済む(デフォルトパターンの充実)
- 条件分岐
- 繰り返し
93
AWS CDK
94
やってみる(本日2度目)
cdk bootstrap 95
TypeScript でCDKを使ってAWS リソースを作成します。
最初にやる事
Bootstrap
VPC
AWS Cloud
Availability Zone 1
Auto Scaling group
Availability Zone 2
NAT Gateway NAT Gateway
Instance InstanceAmazon EC2 Auto Scaling
Application Load Balancer
コードを記述(index.ts)
cdk synth 99
$cdk synth
CDKの内部で使用するCloudFormation
テンプレートの出力/確認
省略… 500行以上あります。
cdk deploy 102
$cdk deploy リソースのデプロイ
cdk destroy 103
$cdk destroy リソースの削除
まとめ
•Infrastructure as Code
•コード化することで、ミスや属人性を排除し、環境構築を自動化する取り組み
IaCってなに?
•AWS CloudFormationの紹介
•コードの管理、デプロイ、差分検出
IaCやってみる
•手続き的なアプローチ、インテリジェント(環境認識)なアプローチ
•AWS CDK 概要
IaCの今後
105
GOAL 106
- IaCってなに?
-> IaCをちょっとやりたくなりました?
- IaCもうやってるよ!
-> なにか1つでもヒントがありましたでしょうか?
- IaCの分野はあまり詳しくはないのですが。
-> Talk to the Speaker!
107
もっといろんなIaCが
やりたい!
We are hiring!
ぜひクラスメソッドへ。
AWS事業本部は
AWSエンジニアを募集しています
ご
清
聴
あ
り
が
と
う
ご
ざ
い
ま
し
た

IaC事始め Infrastructure as Code やってみる?