PythonとYAMLでGCPをDeploy!
「Google Cloud Deployment Manager」
2
3
Masashi Terui @ marcy_terui
I’m a developer and architect in the operators company (JIG-SAW Inc.)
I'm the organizer on the some of events in sapporo with the theme of "Infrastructure as Code”.
I’m a member of JAWS-UG Sapporo and GCPUG Sapporo (Coming soon!)
I develop a IoT application (ServerSide) with Python and more.
I’m a husband of my wife. I’m a father of my son and daughter.
ABOUT ME
4
ABOUT US
5
Coming soon!!
6
7
Cloud Deployment Managerは、複雑なクラウドプラットフォームのソリューションを
シンプルな宣言型のテンプレートを使用して、
開発者が容易に設計、共有、展開、管理することを可能とします。
簡単なWebサーバから複雑な高可用性クラスタまで、
Cloud Deployment Managerはチームがインフラの管理に費やす時間を少なくし、
より多くの時間を開発をに向けることができます。
- - 公式ページ(https://cloud.google.com/deployment-manager/) の英文訳(間違ってたらゴメンナサイ) -
”
つまり
8
複雑なクラウドプラットフォームのソリューション
シンプルな宣言型のテンプレート
容易に設計、共有、展開、管理
→ GCPを
→ YAMLで
→ アレコレできちゃうわけです
9
resources:
- type: compute.v1.instance
name: vm-my-first-deployment
properties:
zone: us-central1-b
machineType: https://www.googleapis.com/compute/v1/projects/sunlit-arcade-100913/zones/us-central1-b/machineTypes/f1-micro
disks:
- deviceName: boot
type: PERSISTENT
boot: true
autoDelete: true
initializeParams:
diskName: disk-my-first-deployment
sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140619
networkInterfaces:
- network: https://www.googleapis.com/compute/v1/projects/sunlit-arcade-100913/global/networks/default
accessConfigs:
- name: External NAT
type: ONE_TO_ONE_NAT
10
いいえ、違います
YAMLとかJSONとかは”Code”ではありません
あくまでデータ(リソース)の表現方法(フォーマット)
別にあ○しぼーをdisってるわけではありません
個人的見解です
11
12
JSON or YAML
CloudFormationはより細かく制御でき、

ほとんどのサービスや機能を網羅しているが表現が冗長

軽く1000行とかのJSONができあがるの、何か間違ってると思うんですよ…

(
Pythonで書ける
13
14
インフラのコード化
自動化
再現可能なインフラ
インフラの世界へ開発のプロセスを持ち込む(TDD, CI etc…)
バズワード・・・?
15
16
17
18
19
resources:
- type: compute.v1.instance
name: vm-my-first-deployment
properties:
zone: us-central1-b
machineType: https://www.googleapis.com/compute/v1/projects/sunlit-arcade-100913/zones/us-central1-b/machineTypes/f1-micro
disks:
- deviceName: boot
type: PERSISTENT
boot: true
autoDelete: true
initializeParams:
diskName: disk-my-first-deployment
sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140619
networkInterfaces:
- network: https://www.googleapis.com/compute/v1/projects/sunlit-arcade-100913/global/networks/default
accessConfigs:
- name: External NAT
type: ONE_TO_ONE_NAT
20
def GenerateConfig(context):
return """
resources:
- type: compute.v1.instance
name: vm-my-first-deployment
properties:
zone: us-central1-b
machineType: https://www.googleapis.com/compute/v1/projects/sunlit-arcade-100913/zones/us-central1-b/machineTypes/f1-micro
<snip>
sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140619
networkInterfaces:
- network: https://www.googleapis.com/compute/v1/projects/sunlit-arcade-100913/global/networks/default
accessConfigs:
- name: External NAT
type: ONE_TO_ONE_NAT
"""
21
import helpers.common
def GenerateConfig(context):
return """
resources:
- type: compute.v1.instance
name: %(name)
properties:
zone: %(zone)
machineType: %(machine_type)
disks:
- deviceName: boot
<snip>
sourceImage: %(source_image)
networkInterfaces:
- network: %(metwork_project)/global/networks/default
<snip>
""" % {"name": (common.GenerateMachineName("myFrontend", context.env(“environment")),
"zone": context.env("zone"),,
"machine_type": common.GenerateMachineTypeURI(zone=context.env("zone"), type=context.env("type")),
"project": common.GenerateProjectURI(context.env("project")),
"source_image": common.GenerateProjectURI("debian-cloud", "ebian-7-wheezy-v20140619"),
"metwork_project": common.GenerateProjectURI("sunlit-arcade-100913")}
22
こんな風に
23
よく使う記述をメソッドにまとめる
オブジェクトに属性を与えて、

メソッドコールするだけ的な感じにしたり
使い回しを考えて共通化・部品化
自分(達)のインフラ構築・管理フレームワークを作れる
24
25
26
gcloud deployment-manager deployments create <name> --config <yml>
27
公式ドキュメント(英語ですw)

https://cloud.google.com/deployment-manager/overview
28
29
30
31




32
33
Pythonでクラウド(特にGCP)を操りたい
イケてるクラウドインフラ上でPythonで

IoTサーバサイド開発したい方

今のところAWSメイン(Kinesis, DynamoDBとか、コアなプロダクト触れます)

GCPは具体的に活用計画有り、Azure他もベンダー問わずメリットあるなら使います。

もちろんInfra as CodeやChatOps等も実践しています。
PythonとYAMLでGCPをDeploy!「Google Cloud Deployment Manager」

PythonとYAMLでGCPをDeploy!「Google Cloud Deployment Manager」