Infrastructure as Code (IaC) ã®ããã® Python ã§å¹ççã§åçŸæ§ã®ããã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çãå®çŸããŸããã°ããŒãã«ãª DevOps ããŒã åãã®å©ç¹ãããŒã«ããã¹ããã©ã¯ãã£ã¹ãæ¢æ±ããŸãã
Python DevOps ãªãŒãã¡ãŒã·ã§ã³ïŒInfrastructure as Code ã®ç¿åŸ
仿¥ã®æ¥éã«é²åããæè¡ç°å¢ã«ãããŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãå¹ççãã€ç¢ºå®ã«ç®¡çããã³ããããžã§ãã³ã°ããèœåã¯ãäžçäžã®äŒæ¥ã«ãšã£ãŠæãéèŠã§ããã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ã®å°é ãšãããé«éãªãœãããŠã§ã¢é ä¿¡ãµã€ã¯ã«ãžã®èŠæ±ã«ãããåŸæ¥ã®ãæåã«ããã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çæ¹æ³ã¯æä»£é ãã«ãªããŸãããããã§ãInfrastructure as Code (IaC) ãç»å ŽããIT ç°å¢ã®æ§ç¯ããããã€ãç®¡çæ¹æ³ãå€é©ããŸãããããŠãIaC ã«é¢ããŠèšãã°ãPython ã¯åŒ·åã§æ±çšæ§ãé«ããåºãæ¡çšãããŠããèšèªãšããŠéç«ã£ãŠãããã°ããŒãã«ãª DevOps ããŒã ãããåªããä¿ææ§ãäžè²«æ§ãã¹ã±ãŒã©ããªãã£ãå®çŸã§ããããã«ããŸãã
Infrastructure as Code (IaC) ãšã¯äœã§ããïŒ
Infrastructure as Code (IaC) ã¯ãç©çããŒããŠã§ã¢æ§æãŸãã¯ã€ã³ã¿ã©ã¯ãã£ããªæ§æããŒã«ã䜿çšããã®ã§ã¯ãªããæ©æ¢°å¯èªãªå®çŸ©ãã¡ã€ã«ãéããŠã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããã³ããããžã§ãã³ã°ãããã©ã¯ãã£ã¹ã§ããããã¯ããµãŒããŒããããã¯ãŒã¯ãããŒã¿ããŒã¹ãããŒããã©ã³ãµãŒãªã©ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ããããŒãžã§ã³ç®¡çããã¹ããèªåãããã€ã¡ã³ããšãã£ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããšåãååã§æ±ãããšãæå³ããŸãã
IaC ã®éèŠãªååã«ã¯æ¬¡ã®ãã®ãå«ãŸããŸãã
- 宣èšåã¢ãããŒãïŒã€ã³ãã©ã¹ãã©ã¯ãã£ã®æãŸããæçµç¶æ ãå®çŸ©ãããšãIaC ããŒã«ããããå®çŸããæ¹æ³ãèãåºããŸããããã¯ãã¹ãããããšã®æç€ºãã¹ã¯ãªããåããåœä»€åã¢ãããŒããšã¯å¯Ÿç §çã§ãã
- ããŒãžã§ã³ç®¡çïŒIaC å®çŸ©ã¯ããŒãžã§ã³ç®¡çã·ã¹ãã ïŒGit ãªã©ïŒã«ä¿åããã倿Žã®è¿œè·¡ãã³ã©ãã¬ãŒã·ã§ã³ãããŒã«ããã¯ãç£æ»ãå¯èœã«ãªããŸãã
- ãªãŒãã¡ãŒã·ã§ã³ïŒIaC ã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã®ããããžã§ãã³ã°ãšç®¡çãèªååããæåã«ãããšã©ãŒãæžããããããã€æéãççž®ããŸãã
- åçŸæ§ãšäžè²«æ§ïŒIaC ã¯ãç°å¢ããããã€ãå®è¡ãã人ã«é¢ä¿ãªããã€ã³ãã©ã¹ãã©ã¯ãã£ãæ¯ååãããã«ãããã€ãããããšãä¿èšŒãããç§ã®ãã·ã³ã§ã¯åäœããããšããåé¡ãæé€ããŸãã
- ã³ã¹ãå¹çïŒããã»ã¹ãèªååãããªãœãŒã¹ã®äœ¿çšçãæé©åããããšã§ãIaC ã¯å€§å¹ ãªã³ã¹ãåæžã«ã€ãªãããŸãã
Infrastructure as Code ã« Python ã䜿çšããçç±
DevOps ã³ãã¥ããã£ã«ããã Python ã®äººæ°ã¯å¶ç¶ã§ã¯ãããŸããããã®æç¢ºãªæ§æãåºç¯ãªã©ã€ãã©ãªãå€§èŠæš¡ã§æŽ»çºãªã³ãã¥ããã£ã¯ãIaC ã«æé©ãªéžæè¢ã§ãããããã€ãã®é åçãªå©ç¹ãæäŸããŸãã
1. å¯èªæ§ãšã·ã³ãã«ã
Python ã®ããããªã¹ãã§çŽæçãªæ§æã«ãããããã°ã©ãã³ã°ã®åå¿è ã§ãç°¡åã«èªã¿ãæžããçè§£ã§ããŸãããã㯠IaC ã«ãšã£ãŠéåžžã«éèŠã§ããIaC ã§ã¯ãããŸããŸãªããŒã éã®ã³ã©ãã¬ãŒã·ã§ã³ããæéã®çµéã«äŒŽãè€éãªã€ã³ãã©ã¹ãã©ã¯ãã£å®çŸ©ã®ç¶æã«æç¢ºããäžå¯æ¬ ã§ãã
2. åºç¯ãªã©ã€ãã©ãªãšãšã³ã·ã¹ãã
Python ã¯ãã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ããããã¯ãŒãã³ã°ãã·ã¹ãã 管çã«åãããŠèª¿æŽãããè±å¯ãªã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã®ãšã³ã·ã¹ãã ãèªã£ãŠããŸãããããã«ã¯ä»¥äžãå«ãŸããŸãã
- Boto3ïŒAmazon Web Services (AWS) SDK for PythonãAWS ãµãŒãã¹ãšã®ããã°ã©ã ã«ãã察話ãå¯èœã«ããŸãã
- Google Cloud Client Libraries for PythonïŒGoogle Cloud Platform (GCP) ãµãŒãã¹ãšå¯Ÿè©±ããããã®ããŒã«ã
- Azure SDK for PythonïŒAzure ãªãœãŒã¹ã管çããããã®ã©ã€ãã©ãªã
- RequestsïŒHTTP ãªã¯ãšã¹ããè¡ããããã¯ã©ãŠããããã€ããŒãŸãã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ãµãŒãã¹ã® RESTful API ãšã®å¯Ÿè©±ã«åœ¹ç«ã¡ãŸãã
- ParamikoïŒSSHv2 ãããã³ã«å®è£ çšããªã¢ãŒãã³ãã³ãã®å®è¡ãšãã¡ã€ã«è»¢éãå¯èœã«ããŸãã
3. ã¯ãã¹ãã©ãããã©ãŒã äºææ§
Python ã¯äºå®äžãã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§å®è¡ããããããIaC ã¹ã¯ãªããã¯ç§»æ€å¯èœã§ãLinuxãWindowsãmacOS ãªã©ãããŸããŸãªç°å¢ã«é©å¿ã§ããŸãã
4. 匷åãªã³ãã¥ããã£ãµããŒã
å€§èŠæš¡ãª Python ã³ãã¥ããã£ã¯ãããã«å©çšã§ãããµããŒãã倿°ã®ãã¥ãŒããªã¢ã«ãããã³æ°ããããŒã«ãã©ã€ãã©ãªã®çµ¶ãéãªãæµããæå³ããŸããããã«ãããäžçäžã® DevOps å®è·µè ã®åŠç¿ãšåé¡è§£æ±ºãå éãããŸãã
5. æ¢åã®ããŒã«ãšã®çµ±å
Python ã¯ãDockerãKubernetesãJenkinsãGitLab CI ãªã©ã®ä»ã®äžè¬ç㪠DevOps ããŒã«ãšã·ãŒã ã¬ã¹ã«çµ±åããããŸãšãŸãã®ããèªååããã CI/CD ãã€ãã©ã€ã³ãå¯èœã«ããŸãã
äžè¬ç㪠Python ããŒã¹ã® IaC ããŒã«ãšãã¬ãŒã ã¯ãŒã¯
Python ã¯ã«ã¹ã¿ã ã¹ã¯ãªããã«äœ¿çšã§ããŸãããå€ãã®åŒ·åãªããŒã«ãšãã¬ãŒã ã¯ãŒã¯ã Python ãå©çšã㊠IaC ã®ååãå®è£ ããŸãããããã®ããŒã«ã¯ãè€éãã®å€ããæœè±¡åããæ§é åããä¿å®å¯èœãªæ¹æ³ã§ã€ã³ãã©ã¹ãã©ã¯ãã£ãå®çŸ©ããã³ç®¡çããŸãã
1. Terraform (Python çµ±å)
Terraform ã¯ãHashiCorp ã«ãã£ãŠéçºãããåºã䜿çšãããŠãããªãŒãã³ãœãŒã¹ã® IaC ããŒã«ã§ãããã®äž»èŠãªæ§æèšèªã¯ HashiCorp Configuration Language (HCL) ã§ãããTerraform 㯠Python ãšéåžžã«ããŸãçµ±åãããŠãããPython ã¹ã¯ãªããã䜿çšããŠè€éãªããžãã¯ãããŒã¿æäœãåçãªãªãœãŒã¹çæãå¯èœã«ããŸããTerraform ã¯ãŒã¯ãããŒã®äžéšãšã㊠Python ã¹ã¯ãªãããåŒã³åºãããšãã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒ
- è€æ°ã®ã¯ã©ãŠããããã€ããŒïŒAWSãAzureãGCP ãªã©ïŒã«ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®ããããžã§ãã³ã°ã
- è€éãªå€å±€ã¢ããªã±ãŒã·ã§ã³ã®ç®¡çã
- ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã¡ã³ãäžã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å€æŽã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã
äŸã®ã·ããªãª (æŠå¿µç)ïŒ
å€éš API ããããŒã¿ããã§ãããã Python ã¹ã¯ãªããããã®åçãªå ¥åã«åºã¥ããŠãAWS ã§ç¹å®ã®æ°ã® EC2 ã€ã³ã¹ã¿ã³ã¹ãããããžã§ãã³ã°ããå¿ èŠããããšããŸããTerraform ããããžã§ããŒã䜿çšããŠãã€ã³ã¹ã¿ã³ã¹æ°ã決å®ãã Python ã¹ã¯ãªãããå®è¡ããTerraform ã«ãããã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããããšãã§ããŸãã
# main.tf (Terraform Configuration)
resource "aws_instance" "example" {
count = "${element(split(",", python_script.instance_counts.stdout), 0)}"
ami = "ami-0abcdef1234567890"
instance_type = "t2.micro"
tags = {
Name = "HelloWorld-${count.index}"
}
}
# Use a local-exec provisioner to run a Python script
resource "null_resource" "run_python_script" {
triggers = {
always_run = timestamp()
}
provisioner "local-exec" {
command = "python scripts/generate_instance_counts.py > instance_counts.txt"
}
}
# Data source to read the output of the Python script
data "local_file" "instance_counts_output" {
filename = "instance_counts.txt"
}
# This resource dynamically gets the instance count from the script's output
# Note: This is a simplified conceptual example. A more robust approach would involve
# using Terraform's `templatefile` function or custom providers for complex interactions.
resource "local_file" "instance_counts" {
content = data.local_file.instance_counts_output.content
}
# A python script (scripts/generate_instance_counts.py) could look like:
# import requests
#
# # Fetch data from an external API (e.g., to determine load)
# try:
# response = requests.get("https://api.example.com/current_load")
# response.raise_for_status() # Raise an exception for bad status codes
# load = response.json().get("load", 1)
# print(load)
# except requests.exceptions.RequestException as e:
# print(f"Error fetching load: {e}. Defaulting to 1 instance.")
# print(1)
2. Ansible (Python ããã¯ãšã³ã)
Ansible ã¯ãæ§æç®¡çãã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã¡ã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ãªã©ã®è€éãªã¿ã¹ã¯ãç°¡çŽ åããããã«å®£èšåã¢ãããŒãã䜿çšãã匷åãªèªååãšã³ãžã³ã§ããAnsible ã¯ãã¬ã€ããã¯ã« YAML ã䜿çšããŸããããã®ã³ã¢ãšã³ãžã³ã¯ Python ã§èšè¿°ãããŠããããã¬ã€ããã¯ããã³ã«ã¹ã¿ã ã¢ãžã¥ãŒã«å ã§ Python ã¹ã¯ãªããã䜿çšã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒ
- ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãšæ§æã®èªååã
- ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã¡ã³ãã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã
- ãŠãŒã¶ãŒã¢ã«ãŠã³ããšæš©éã®ç®¡çã
- è€æ°ã®ãµãŒããŒã«ãããè€éãªã¯ãŒã¯ãããŒã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã
äŸã®ã·ããªãªïŒ
Ansible ã䜿çšããŠã倿°ã®ãã·ã³ã« Web ãµãŒããŒãã€ã³ã¹ããŒã«ããŠæ§æããŸããçµã¿èŸŒã¿ã® Ansible ã¢ãžã¥ãŒã«ã§ã«ããŒãããŠããªãéåžžã«ç¹æ®ãªã¿ã¹ã¯ãŸãã¯è€éãªã¿ã¹ã¯ã®ããã«ãã«ã¹ã¿ã Python ã¢ãžã¥ãŒã«ãäœæã§ããŸãã
# playbook.yml (Ansible Playbook)
---
- name: Configure web server
hosts: webservers
become: true
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Deploy custom application config using a Python script
copy:
content: "{{ lookup('pipe', 'python scripts/generate_nginx_config.py') }}"
dest: /etc/nginx/sites-available/default
notify:
- Restart Nginx
handlers:
- name: Restart Nginx
service: name=nginx state=restarted
# scripts/generate_nginx_config.py (Python script)
# import json
#
# # Fetch dynamic configuration data (e.g., from a database or API)
# backend_servers = ["192.168.1.100", "192.168.1.101"]
#
# config = f"server {{
# listen 80;
# location / {{
# proxy_pass http://backend_servers;
# }}
# }}"
#
# print(config)
3. Pulumi
Pulumi ã¯ãPython ãå«ãäœ¿ãæ £ããããã°ã©ãã³ã°èšèªã䜿çšããŠã¯ã©ãŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãå®çŸ©ã§ããææ°ã® IaC ããŒã«ã§ããããã«ããããã§ã« Python ã«ç²ŸéããŠããéçºè ã«å€§ããªå©ç¹ãæäŸããæ¢åã®ã¹ãã«ãã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çã«äœ¿çšã§ããããã«ããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒ
- AWSãAzureãGCPãKubernetes ãªã©ã® Python ã§ã€ã³ãã©ã¹ãã©ã¯ãã£ãå®çŸ©ããŸãã
- è€éãªã€ã³ãã©ã¹ãã©ã¯ãã£ããžãã¯ã®ããã« Python ã®ãã¹ãŠã®ããã°ã©ãã³ã°æ©èœãå©çšããŸãã
- ã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çãã¢ããªã±ãŒã·ã§ã³éçºã¯ãŒã¯ãããŒã«çŽæ¥çµ±åããŸãã
äŸã®ã·ããªãªïŒ
Python ã䜿çšããŠãç¹å®ã®ã¢ã¯ã»ã¹å¶åŸ¡ããªã·ãŒãæã€ AWS S3 ãã±ãããå®çŸ©ããŸãã
# __main__.py (Pulumi Program)
import pulumi
import pulumi_aws as aws
# Create an AWS resource (S3 Bucket)
bucket = aws.s3.Bucket("my-bucket",
acl="private",
versioning={
"enabled": True,
},
opts=pulumi.ResourceOptions(provider=aws.Provider("us-west-2")) # Specify the AWS region
)
# Export the bucket name
pulumi.export("bucket_name", bucket.id)
# Example of conditional logic using Python
should_enable_logging = True
if should_enable_logging:
log_bucket = aws.s3.Bucket("my-bucket-logs", acl="log-delivery-write")
bucket.logging = aws.s3.BucketLoggingArgs(
target_bucket=log_bucket.id,
target_prefix="logs/"
)
pulumi.export("log_bucket_name", log_bucket.id)
4. AWS CloudFormation (Python ã«ã¹ã¿ã ãªãœãŒã¹)
AWS CloudFormation ã¯ãAWS ãªãœãŒã¹ã®ã¢ãã«åãšèšå®ãæ¯æŽãããµãŒãã¹ã§ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®ç®¡çã«ãããæéãççž®ããã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«ããå€ãã®æéãè²»ããããšãã§ããŸããCloudFormation 㯠JSON ãŸã㯠YAML ãã³ãã¬ãŒãã䜿çšããŸãããã«ã¹ã¿ã ãªãœãŒã¹ãäœæããŠãã®æ©èœãæ¡åŒµã§ããŸããPython ã¯ããããã®ã«ã¹ã¿ã ãªãœãŒã¹ãéçºããããã®åªããéžæè¢ã§ãããçŽæ¥ç㪠CloudFormation ãµããŒãããªã AWS ãµãŒãã¹ãçµ±åããããè€éãªããžãã¯ãå®è£ ãããã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒ
- AWS ãªãœãŒã¹ã®ããããžã§ãã³ã°ã
- å€éšãµãŒãã¹ãŸãã¯ã«ã¹ã¿ã ããžãã¯ã CloudFormation ã¹ã¿ãã¯ã«çµ±åããŸãã
- æ¡ä»¶ä»ãããžãã¯ã䜿çšããŠè€éãªãããã€ã¡ã³ãã管çããŸãã
äŸã®ã·ããªãª (æŠå¿µç)ïŒ
Python Lambda 颿°ã䜿çšããŠãµãŒãããŒãã£ãµãŒãã¹ïŒSlack ãã£ãã«ãã«ã¹ã¿ã ã¢ãã¿ãªã³ã°ã¢ã©ãŒããªã©ïŒãããããžã§ãã³ã°ããã«ã¹ã¿ã CloudFormation ãªãœãŒã¹ãäœæããŸãã
CloudFormation ãã«ã¹ã¿ã ãªãœãŒã¹ãäœæãæŽæ°ããŸãã¯åé€ããå¿
èŠãããå Žåãæå®ããã Lambda 颿°ïŒPython ã§èšè¿°ïŒãåŒã³åºããŸããæ¬¡ã«ããã® Lambda 颿°ã¯ Python ã©ã€ãã©ãª (boto3 ãªã©) ã䜿çšããŠãä»ã® AWS ãµãŒãã¹ãŸãã¯å€éš API ãšå¯Ÿè©±ããŠãªã¯ãšã¹ããæºãããŸãã
5. Serverless Framework (Python ä»ã)
Serverless Framework ã¯ãç¹ã« AWS Lambda ã§ãµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã³ãããã€ããããã®äžè¬çãªããŒã«ã§ããæ§æã«ã¯ YAML ã䜿çšããŸãããéçºè 㯠Python ã§é¢æ°ãèšè¿°ã§ããŸããå³å¯ã«ã¯äžè¬çãªã€ã³ãã©ã¹ãã©ã¯ãã£ãããããžã§ãã³ã°ããããã®ãã®ã§ã¯ãããŸããããææ°ã®ã¯ã©ãŠããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãã¥ãŒãã£ã³ã°ã¬ã€ã€ãŒã管çããããã«ã¯äžå¯æ¬ ã§ãããå€ãã®å Žåãã€ã³ãã©ã¹ãã©ã¯ãã£å šäœã®ããªãã®éšåã圢æããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒ
- AWS Lambda 颿°ã®ãããã€ãšç®¡çã
- API ã²ãŒããŠã§ã€ãã€ãã³ããœãŒã¹ãããã³ãã®ä»ã®ãµãŒããŒã¬ã¹ã³ã³ããŒãã³ãã®å®çŸ©ã
- ãµãŒããŒã¬ã¹ã¯ãŒã¯ãããŒã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã
äŸã®ã·ããªãªïŒ
SQS ãã¥ãŒããåä¿¡ã¡ãã»ãŒãžãåŠçãã Python ããŒã¹ã® AWS Lambda 颿°ããããã€ããŸãã
# serverless.yml (Serverless Framework Configuration)
service: my-python-lambda-service
provider:
name: aws
runtime: python3.9
region: us-east-1
iamRoleStatements:
- Effect: Allow
Action: "sqs:ReceiveMessage"
Resource: "arn:aws:sqs:us-east-1:123456789012:my-queue"
functions:
processMessage:
handler: handler.process
events:
- sqs: arn:aws:sqs:us-east-1:123456789012:my-queue
# handler.py (Python Lambda Function)
# import json
#
# def process(event, context):
# for record in event['Records']:
# message_body = record['body']
# print(f"Received message: {message_body}")
# # Process the message here...
# return {
# 'statusCode': 200,
# 'body': json.dumps('Messages processed successfully!')
# }
Python IaC ã®ãã¹ããã©ã¯ãã£ã¹
Python ã IaC ã«å¹æçã«æŽ»çšããã«ã¯ããã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšãäžå¯æ¬ ã§ãã
1. ããŒãžã§ã³ç®¡ç (Git) ãæ¡çšãã
ãã¹ãŠã® IaC å®çŸ© (Terraform HCLãAnsible ãã¬ã€ããã¯ãPulumi Python ã³ãŒããªã©) ã Git ãªã©ã®ããŒãžã§ã³ç®¡çã·ã¹ãã ã«ä¿åããŸããããã«ãããæ¬¡ã®ããšãå¯èœã«ãªããŸãã
- 倿Žã远跡ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®é²åãçè§£ããã
- ããŒã ã¡ã³ããŒéã®ã³ã©ãã¬ãŒã·ã§ã³ã
- 以åã®å®å®ããç¶æ ãžã®ç°¡åãªããŒã«ããã¯ã
- ç£æ»ãšã³ã³ãã©ã€ã¢ã³ã¹ã
2. CI/CD ãã€ãã©ã€ã³ãå®è£ ãã
IaC ã CI/CD ãã€ãã©ã€ã³ã«çµ±åããŸããããã¯ã次ã®ããšãæå³ããŸãã
- Lint ãšãã©ãŒãããïŒIaC ã³ãŒãã®ã¹ã¿ã€ã«ãšæ§æã®ãšã©ãŒãèªåçã«ãã§ãã¯ããŸãã
- ãã¹ãïŒèªåãã¹ã (Terraform ã®å Žå㯠TerratestãAnsible ã®å Žå㯠Molecule ãªã©ã䜿çš) ãå®è¡ããŠããããã€ã¡ã³ãåã«ã€ã³ãã©ã¹ãã©ã¯ãã£ã³ãŒããæ€èšŒããŸãã
- èªåãããã€ã¡ã³ãïŒå€æŽãã¡ã€ã³ãã©ã³ãã«ããŒãžãããšãã€ã³ãã©ã¹ãã©ã¯ãã£ã®ãããã€ã¡ã³ããèªåçã«ããªã¬ãŒãããŸãã
- ãã¬ãã¥ãŒ/ãã©ã€ã©ã³ïŒ
terraform planã Pulumi ã®ãã¬ãã¥ãŒãªã©ã®æ©èœãå©çšããŠãé©çšãããåã«ã©ã®ãããªå€æŽãè¡ããããã確èªããŸãã
3. ã¢ãžã¥ãŒã«æ§ãšåå©çšæ§ã掻çšãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒããšåæ§ã«ãIaC ã¯ã¢ãžã¥ãŒã«åãããŠããå¿ èŠããããŸããã€ã³ãã©ã¹ãã©ã¯ãã£ãåå©çšå¯èœãªã³ã³ããŒãã³ããã¢ãžã¥ãŒã«ããŸãã¯ãã³ãã¬ãŒãã«åå²ããŸããããã«ãããæ¬¡ã®ããšãä¿é²ãããŸãã
- ãããžã§ã¯ãå šäœã®äžè²«æ§ã
- ã¡ã³ããã³ã¹ãšæŽæ°ã容æã«ãªããŸãã
- åŽåã®éè€ãåæžãããŸãã
ããšãã°ãããŸããŸãªç°å¢ (éçºãã¹ããŒãžã³ã°ãæ¬çª) ã§åå©çšã§ãã PostgreSQL ããŒã¿ããŒã¹ãŸã㯠Kubernetes ã¯ã©ã¹ã¿ãŒããããã€ããããã®æšæºã¢ãžã¥ãŒã«ãäœæããŸãã
4. ã·ãŒã¯ã¬ãã管çãå®è£ ãã
æ©å¯æ å ± (API ããŒããã¹ã¯ãŒããèšŒææž) ã IaC ãã¡ã€ã«ã«çŽæ¥ããŒãã³ãŒãããªãã§ãã ãããHashiCorp VaultãAWS Secrets ManagerãAzure Key VaultãGCP Secret Manager ãªã©ã®å°çšã®ã·ãŒã¯ã¬ãã管çããŒã«ã䜿çšããŸããæ¬¡ã«ãPython ã¹ã¯ãªããã¯ããããã®ã·ãŒã¯ã¬ãããå®è¡æã«å®å šã«ååŸã§ããŸãã
5. 宣èšçãªèãæ¹ãåãå ¥ãã
Python èªäœã¯åœä»€çã§ããã䜿çšãã IaC ããŒã« (Terraform ã Pulumi ãªã©) ã¯ãå€ãã®å Žåã宣èšåã¢ãããŒãã奜ã¿ãŸããããã«å°éããããã®æ£ç¢ºãªæé ãã¹ã¯ãªããåããã®ã§ã¯ãªããã€ã³ãã©ã¹ãã©ã¯ãã£ã®æãŸããæçµç¶æ ãå®çŸ©ããããšã«çŠç¹ãåœãŠãŸããããã«ãããç¹ã«åçãªã¯ã©ãŠãç°å¢ã§ã¯ãIaC ãããå ç¢ã«ãªãã管çã容æã«ãªããŸãã
6. ã€ã³ãã©ã¹ãã©ã¯ãã£ãææžåãã
ã³ãŒãã䜿çšããŠããããã¥ã¡ã³ãã¯éèŠã§ããIaC æ§æãããŸããŸãªãªãœãŒã¹ã®ç®çãããã³ Python ã§å®è£ ãããã«ã¹ã¿ã ããžãã¯ãææžåããŸããããã¯ãæ°ããããŒã ã¡ã³ããŒã®ãªã³ããŒãã£ã³ã°ããä»åŸã®åç §ã«éåžžã«åœ¹ç«ã¡ãŸãã
7. ã¯ãã¹ã¯ã©ãŠãæŠç¥ãæ€èšãã
çµç¹ãè€æ°ã®ã¯ã©ãŠããããã€ã㌠(AWS ã Azure ãªã©) ã«ããã£ãŠéçšããŠããå ŽåãTerraform ã Pulumi ãªã©ã® Python ããŒã¹ã® IaC ããŒã«ã¯åªããéžæè¢ã§ãããããã€ããŒåºæã®è©³çŽ°ãæœè±¡åããç°ãªãã¯ã©ãŠãå šäœã§äžè²«ããŠãªãœãŒã¹ã管çã§ãããããæè»æ§ãåäžãããã³ããŒããã¯ã€ã³ãåé¿ã§ããŸãã
8. ãã¹ããå³å¯ã«èªååãã
ãã¹ã㯠IaC ã«ãšã£ãŠéåžžã«éèŠã§ããããŸããŸãªã¬ãã«ã®ãã¹ããå®è£ ããŸãã
- Lint ãšéçåæïŒæ§æãšã©ãŒãšã¹ã¿ã€ã«ã®åé¡ãæ©æã«ãã£ããããŸãã
- åäœãã¹ãïŒIaC ã§äœ¿çšãããã«ã¹ã¿ã Python ã¢ãžã¥ãŒã«ãŸãã¯ã¹ã¯ãªããçšã
- çµ±åãã¹ãïŒããŸããŸãªã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã³ããŒãã³ããæåŸ ã©ããã«é£æºããããšã確èªããŸãã
- ãšã³ãããŒãšã³ããã¹ãïŒãããã€ãããã€ã³ãã©ã¹ãã©ã¯ãã£ãšã®ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããŸãã
Terratest (Terraform çš) ã Molecule (Ansible çš) ãªã©ã®ããŒã«ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã³ãŒãã®çµ±åãã¹ããšãšã³ãããŒãšã³ããã¹ããäœæããã³å®è¡ããããã«éåžžã«åœ¹ç«ã¡ãŸãã
Python ãšææ°ã® DevOps ã¢ãŒããã¯ãã£
IaC ã«ããã Python ã®åœ¹å²ã¯ãææ°ã® DevOps ã¢ãŒããã¯ãã£ãå¯èœã«ããããšãŸã§åºãã£ãŠããŸãã
1. ãã€ã¯ããµãŒãã¹ãšã³ã³ããå
Kubernetes ãªã©ã®ãã©ãããã©ãŒã ã«ãã£ãŠãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãããã³ã³ãã (Docker) ã䜿çšããŠãã€ã¯ããµãŒãã¹ããããã€ããå ŽåãIaC ã¯äžå¯æ¬ ã§ããPython ã䜿çšããŠã次ã®ããšãã§ããŸãã
- Pulumi ã䜿çšããŠããŸã㯠Kubernetes API ãšå¯Ÿè©±ããã«ã¹ã¿ã Python ã¹ã¯ãªããã䜿çšããŠãKubernetes ãªãœãŒã¹ (ãããã€ã¡ã³ãããµãŒãã¹ãã€ã³ã°ã¬ã¹) ãå®çŸ©ããŸãã
- Docker ã€ã¡ãŒãžã®ãã«ããšãããã€ãèªååããŸãã
- Terraform ãŸã㯠Pulumi ã䜿çšããŠãKubernetes ã¯ã©ã¹ã¿ãŒ (EKSãAKSãGKE ãªã©) ããã¹ãããããã«å¿ èŠãªã¯ã©ãŠãã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããŸãã
2. ãµãŒããŒã¬ã¹ã³ã³ãã¥ãŒãã£ã³ã°
Serverless Framework ã§èª¬æããããã«ãPython ã¯ãµãŒããŒã¬ã¹é¢æ°ã«ãšã£ãŠæåªå äºé ã§ããIaC ããŒã«ã¯ããããã®é¢æ°ããµããŒãããåºç€ãšãªãã¯ã©ãŠããªãœãŒã¹ (LambdaãAPI ã²ãŒããŠã§ã€ãSQSãDynamoDB) ãå®çŸ©ããã³ããããžã§ãã³ã°ããããã«äœ¿çšãããŸãã
3. ãã«ãã¯ã©ãŠãããã³ãã€ããªããã¯ã©ãŠãç°å¢
è€æ°ã®ãããªãã¯ã¯ã©ãŠããšãªã³ãã¬ãã¹ã®ããŒã¿ã»ã³ã¿ãŒã«ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããã«ã¯ãå ç¢ãªèªååãå¿ èŠã§ããPython ããŒã¹ã® IaC ããŒã«ã¯ã倿§ãªç°å¢ã§ãªãœãŒã¹ãããããžã§ãã³ã°ããã³ç®¡çããããã®çµ±åã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããäžè²«æ§ã確ä¿ããè€éãã軜æžããŸãã
課é¡ãšèæ ®äºé
Python IaC ã¯å€§ããªã¡ãªããããããããŸãããæœåšçãªèª²é¡ã«æ³šæããããšãéèŠã§ãã
- åŠç¿æ²ç·ïŒæ°ããããŒã«ã𿹿³è«ãæ¡çšããã«ã¯ãåŠç¿ãå¿ èŠã§ããããŒã ã¯ãPythonãç¹å®ã® IaC ããŒã«ãããã³ã¯ã©ãŠããã©ãããã©ãŒã ã«é¢ãããã¬ãŒãã³ã°ã«æéãæè³ããå¿ èŠããããŸãã
- ç¶æ 管çïŒIaC ããŒã«ã¯ãã³ãŒããå®éã®ãªãœãŒã¹ã«ãããã³ã°ããç¶æ ãã¡ã€ã«ãä¿æããŸãããã®ç¶æ ãé©åã«ç®¡çããããšã¯ãççŸããšã©ãŒãåé¿ããããã«éåžžã«éèŠã§ãã
- ããªããæ€åºïŒIaC ã®å€éšã§è¡ããã倿Žã¯ãæ§æããªããã«ã€ãªããå¯èœæ§ããããŸããIaC å®çŸ©ã«å¯ŸããŠã€ã³ãã©ã¹ãã©ã¯ãã£ã宿çã«ã¬ãã¥ãŒããã³èª¿æŽããŸãã
- åçŽãªã¿ã¹ã¯ã®è€éãïŒéåžžã«åçŽãªã1 åéãã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã¿ã¹ã¯ã®å Žåãå®å šãª IaC ã»ããã¢ããã¯éå°ã«ãªãå¯èœæ§ããããŸãããã ããåçŸæ§ãŸãã¯ç®¡çãå¿ èŠãªãã®ã«ã€ããŠã¯ãIaC ãæçã§ãã
- ã»ãã¥ãªãã£ïŒç¹ã«ã¯ã©ãŠãã¢ã«ãŠã³ããšæ©å¯ããŒã¿ãžã®ã¢ã¯ã»ã¹ã管çããå Žåã¯ãé©åãªã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ã«åŸã£ãŠããããšã確èªããŠãã ããã
çµè«
Python ã¯ãææ°ã® DevOps ãã©ã¯ãã£ã¹ã®åºç€ãšããŠã®å°äœã確ç«ããŠãããInfrastructure as Code ã«ããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã®ãã¯ãŒãšæè»æ§ã®èšŒã§ããIaC ã« Python ãæ¡çšããããšã§ãäžçäžã®çµç¹ã¯ãIT ã€ã³ãã©ã¹ãã©ã¯ãã£ã®ç®¡çã«ãããŠãåäŸã®ãªãã¬ãã«ã®èªååãäžè²«æ§ãããã³å¹çæ§ãå®çŸã§ããŸããTerraform ãš Pulumi ã䜿çšããã¯ã©ãŠããªãœãŒã¹ã®ããããžã§ãã³ã°ãããAnsible ã䜿çšããæ§æã®èªååãServerless Framework ã䜿çšãããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ãŸã§ãPython 㯠DevOps ããŒã ãèªä¿¡ãšã¹ããŒããæã£ãŠã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ããããã€ãããã³ç®¡çã§ããããã«ããŸãã
DevOps ãªãŒãã¡ãŒã·ã§ã³ã®æ ãç¶ããäžã§ãPython ã IaC æŠç¥ã®äžå¿ã«æ®ããããšã§ãããå ç¢ã§ã¹ã±ãŒã©ãã«ã§ã³ã¹ãå¹çã®é«ã IT éçšãå®çŸããããšã¯ééããããŸãããéèŠãªã®ã¯ãé©åãªããŒã«ãéžæãããã¹ããã©ã¯ãã£ã¹ãæ¡çšããç¶ç¶çãªåŠç¿ãšã³ã©ãã¬ãŒã·ã§ã³ã®æåãè²ãããšã§ããã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çã®æªæ¥ã¯èªååãããŠãããPython ã¯ãã®æªæ¥ãå¯èœã«ããéèŠãªèŠçŽ ã§ãã