æ¬è¨äºã¯
ãAdvent Calendar 2024ã
20æ¥ç®â¡ã®è¨äºã§ãã
ðð
20â æ¥ç®
â¶â¶ æ¬è¨äº â¶â¶
21æ¥ç®
ð
ð
ããã«ã¡ã¯ãå¾è¤ã§ãã
ä»åã¯IaCãã¼ã«ã®ä»£è¡¨æ ¼ã§ããAWS CDKã¨Terraformã«ã¤ãã¦ã®ã話ã§ãã
AWSãªã½ã¼ã¹ã®ç®¡çã«ã¯CloudFormationã使ãããã·ã¼ã³ãããã¾ãããè¿å¹´ã®æ³¨ç®åº¦ãå©ç¨çãè¦ãã¨AWS CDKãTerraformãæ¡ç¨ãã¦ããã±ã¼ã¹ãå¤ãã§ãããã®ããå½è¨äºã§ã¯AWS CDKã¨Terraformã«ç¦ç¹ãå½ã¦ã¦æ¯è¼ãããã®ä¸ã§ãé¸æã®æ±ºãæã«å¤§ããé¢ããã³ã¼ãã®æ¸ãæ¹ã«çç®ãããã¨æãã¾ãã
ç§èªèº«ãCDKã¨Terraformã使ãè¾¼ãã§ãã¾ããããIAMãªã½ã¼ã¹ã®ä½æã«ããã¦ä¸¡è
ã®éããé¡èã«æãããã¾ããã®ã§ãIAMãªã½ã¼ã¹ä½æã®å
·ä½ä¾ãéãã¦ããããã®ç¹å¾´ã®éããæ¯è¼ãã¦ããããã¨æãã¾ãã
ããããCDKã¨ã¯
CDKã¨ã¯AWSãæä¾ããã¤ã³ãã©ã³ã¼ãåã®ããã®ãã¬ã¼ã ã¯ã¼ã¯ã§ãAWSç°å¢ã«ç¹åããã¤ã³ãã©ç®¡çã«é©ãã¦ãã¾ããCDKã®å
é¨ã§ã¯CloudFormationã使ããã¦ãããTypeScriptãPythonã©ã®ä¸è¬çãªããã°ã©ãã³ã°è¨èªã使ã£ã¦å®ç¾©ã§ãããããããæè»ãªããã°ã©ãã³ã°ãå¯è½ã§ããæ½è±¡åã¨ããæ¦å¿µãããããã¹ã¦ã®ãã©ã¡ã¼ã¿ãè¨è¼ããã¨ããã¹ããã©ã¯ãã£ã¹ã«æ²¿ã£ã¦ãã¼ã«å´ãèªåã§è¨å®é©ç¨ããããã«ãããã¨ãå¯è½ã§ããããé常ã«é
åçã§ãã
ã¡ãªã¿ã«CDK for Terraformã¨ãããCDKã®å
é¨ã§åä½ãã¦ããã®ãCloudFormationã§ã¯ãªãTerraformã«ãªã£ã¦ãããã¼ã«ãåå¨ãã¾ãããæ¡ç¨çãæ¯è¼çä½ãããæ¬è¨äºã§ã¯å²æãã¾ãã
ããããTerraformã¨ã¯
Terraformã¯HashiCorp社ã«ãã£ã¦æä¾ããã¦ããã¤ã³ãã©æ§ç¯ãã¼ã«ã§ãHCLï¼HashiCorp Configuration Languageï¼ã¨ããå°ç¨è¨èªã使ã£ã¦ãã¯ã©ã¦ãã¤ã³ãã©ãã³ã¼ãã§å®ç¾©ãã¾ããAWS以å¤ã®ã¯ã©ã¦ããããã¤ãã¼ï¼AzureãGoogle Cloudãªã©ï¼ãããªã³ãã¬ãã¹ã®ã¤ã³ãã©ã管çã§ããããããã«ãã¯ã©ã¦ãæ¦ç¥ã«æè»ã«å¯¾å¿ãã¾ãã
ã³ã¼ãéã®æ¯è¼
ããã§ã¯å®éã«æ¯è¼ãã¦ããã¾ããããã¾ãã¯ã³ã¼ãéã®éãã§ãã
CDKã使ã£ã¦ãæä½éã®è¨å®ã§ä»¥ä¸ãªã½ã¼ã¹ãä½ã£ã¦ããã¾ãã
ã»EC2
ã»S3
ã»IAMãã¼ã« (S3åç
§æ¨©éæ)
ã»EC2ã«IAMãã¼ã«ãã¢ã¿ãã
CDKã使ã£ããªã½ã¼ã¹å®ç¾©é¨å
#EC2ä½æ const instance = new ec2.Instance(this, 'Instance', { vpc: vpc, instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO), machineImage: new ec2.AmazonLinuxImage({ generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2023 }), }); #S3ä½æ const bucket = new s3.Bucket(this, 'my_Bucket', { bucketName: 'mybucket2024-example' }); #S3ã¸ã®åç §æ¨©éãæã£ãIAMãã¼ã«ãEC2ã«ä»ä¸ bucket.grantRead(instance);
ç¶ãã¦Terraformã®ã³ã¼ãã§ããåæ§ã®æ§æãä½ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
Terraformã使ã£ããªã½ã¼ã¹å®ç¾©é¨å
#EC2ä½æ resource "aws_instance" "ec2" { ami = "ami-xxxxxxxxxx" instance_type = "t2.micro" subnet_id = "subnet-xxxxxxxxx" iam_instance_profile = aws_iam_role.role.name } #S3ä½æ resource "aws_s3_bucket" "s3" { bucket = "mybucket2024-example" } #IAMãã¼ã«ä½æ resource "aws_iam_role" "role" { name = "ec2-example" assume_role_policy = << -EOT { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOT } # ã¤ã³ã¹ã¿ã³ã¹ãããã¡ã¤ã«è¨å® resource "aws_iam_instance_profile" "Instance-profile" { name = aws_iam_role.role.name role = aws_iam_role.role.name } #IAMããªã·ã¼ä½æ resource "aws_iam_policy" "policy" { name = "example-policy" policy = << -EOT { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetBucket*", "s3:GetObject*", "s3:List*" ], "Resource": [ "arn:aws:s3:::mybucket2024-example", "arn:aws:s3:::mybucket2024-example/*" ], "Effect": "Allow" } ] } EOT } #IAMããªã·ã¼ãIAMãã¼ã«ã«ã¢ã¿ãã resource "aws_iam_policy_attachment" "attach" { role = aws_iam_role.role.name policy_arn = aws_iam_policy.policy.arn }
ä¸ç®çç¶ã§CDKã®æ¹ãã³ã¼ãéãå°ãªãã§ãããã³ã¼ãéãå°ãªãã¨å¯èªæ§ãé«ããè¨è¼ãã¹ã®å¯è½æ§ãæ¸ãã¾ããç¹ã«IAMãªã½ã¼ã¹ã®å®ç¾©é¨åãã»ã¨ãã©ä¸è¦ã§ãgrantRead
ã¡ã½ããã®1è¡ã§å®è£
ã§ãã¾ããã
ã³ã¼ããèªã¿æ¸ãããé£æ度ã®æ¯è¼
ç¶ãã¦ãé£æ度ã®æ¯è¼ã§ãã
CDKã¯ä¸è¬çãªããã°ã©ãã³ã°è¨èªã§è¨è¿°ã§ãããããèªç±åº¦ã®é«ãã³ã¼ããæ¸ãã¾ãããããèªç±åº¦ãé«ããããã«ãé¢æ°ã®ä½¿ãæ¹ãæ§é è¨è¨ãå¤æ§ã§ããã第ä¸è
ãæ¸ããã³ã¼ããèªã¿è§£ãã®ã«æéãããããã¨ãããã¾ããããã«æ½è±¡åã®æ¦å¿µãç解ããå¿
è¦ããããã¤ã³ãã©ã¨ã³ã¸ãã¢ã«ã¨ã£ã¦ã¯æ
£ããªãããã°ã©ãã³ã°è¨èªãç¿å¾ããªããã°ãªããªãå ´åãããã¾ãããããã®è¦å ããããã°ã©ãã³ã°è¨èªãæ½è±¡åã®ç解ãåæã¨ãªããã¨ã£ãããã®ãã¼ãã«ãé«ãå°è±¡ãããã¾ãããã ãè¦æ¦ããã®ã¯ã»ãã®å§ãã®é¨åã ãã§ãæ
£ãã¦ãã¾ãã°ãªãã¦ãã¨ã¯ãªãã§ããããã°ã©ãã³ã°è¨èªãTypeScriptã«ããã°ãVSCodeçã®IDEã®åè£å®æ©è½ãå¹ãã®ã§å©ç¨å¯è½ãªããããã£ãã¡ã½ãããç°¡åã«ç¢ºèªã§ããããã¥ã¡ã³ãåç
§ããæéãçããã®ã§é常ã«ä¾¿å©ã ã¨æãããã¾ãã
ä¸æ¹ãTerraformã«é¢ãã¦ã¯èªä½é¢æ°ãä½ããªããã°ifæã使ããªãã®ã§ãããç¨åº¦éããã使ãæ¹ã«ãªã£ã¦ãã¾ããæµæ´¾ãããããã¨ãããã©ã®ããã«ã¢ã¸ã¥ã¼ã«ãåããããã©ã®ããã«ãã£ã¬ã¯ããªãåãããã¨ãã£ããããã§ãããããã·ã³ãã«ãªãã¼ã«ã§å¦ç¿ã³ã¹ããä½ãå°è±¡ãããã¾ããã¨ã£ãããã®ãã¼ãã«ãä½ããã¨ã«å ãããããã«è½ã¡ã¦ããæ å ±ãã¨ã¦ãå¤ãã®ã§éçºãã¹ã ã¼ãºã«é²ã¿ãããã§ãã
AWSã«é¢ããåæç¥èã®æ¯è¼
ç¶ãã¦ãAWSã®åæç¥èã®æ¯è¼ã§ãã
CDKã§IAMãªã½ã¼ã¹ãä½ãå ´åã¯ãIAMããªã·ã¼ã«ã¯s3:GetBucketã¢ã¯ã·ã§ã³ãå¿
è¦ãããIAMãã¼ã«ãç´ã¥ããããã«ã¤ã³ã¹ã¿ã³ã¹ãããã¡ã¤ã«ãæå®ããå¿
è¦ããããã¨ãã£ããã¨ãç¥ã£ã¦ããå¿
è¦ãããã¾ããããããæå°æ¨©éã«ãªãããã«ç°¡åã«å®è£
ã§ãã¾ãããã®ããã«ããã¹ã¦ã®ãã©ã¡ã¼ã¿ãè¨è¼ããã¨ããã¹ããã©ã¯ãã£ã¹ã«æ²¿ã£ã¦ãã¼ã«å´ãèªåã§è¨å®ããããããããåãããã®ãä½ãã¦ãã¾ãã¾ãã
ä¸æ¹ãTerraformã¯AWSãµã¼ãã¹ã¸ã®ããæ·±ãç解ãæ±ãããã¾ããä¸è¨ã³ã¼ãã®ã¨ããã詳細è¨è¨æ¸ãåããããã«ã³ã¼ããæ¸ãã¦ãããã¨ã«ãªããã¤ã³ãã©ã¨ã³ã¸ãã¢ã«ã¨ã£ã¦ã¯é¦´æã¿ã®ããä½æ¥ã«ãªãã§ãããã
ãTerraformã³ã¼ãã®æ¸ãæ¹ãããããªããï¼ã対象AWSãµã¼ãã¹ã®ç解ãä¸è¶³ãã¦ãããã¨ããç¶æ³ã§ãããã¨ãå¤ãæè¦ã§ãã
ä¸è¨ã表ã«ããã¨
æ¯è¼é ç® | CDK | Terraform |
---|---|---|
ã³ã¼ãé | å° | å¤ |
éçºã«å¿ è¦ãªåæç¥èé | å° | å¤ |
éçºã®ãããã | é« | é« |
ã¾ã¨ã
CDKæ¡ç¨ãè¯ããã¿ã¼ã³ãTerraformæ¡ç¨ãè¯ããã¿ã¼ã³ãèãã¦ã¿ã¾ããã
CDKæ¡ç¨ãè¯ããã¿ã¼ã³ï¼
ã»ã¢ããªéçºè
ãAWSã¤ã³ãã©ãæ±ãå ´å
ã»æè¡æ¤è¨¼ããµãµã£ã¨è¡ãããå ´å
Terraformæ¡ç¨ãè¯ããã¿ã¼ã³ï¼
ã»ãã¼ã å
ã«ã¢ããªéçºçµé¨è
ãããªãå ´åããããã¯å°ãªãå ´å
ã»ãããã¯ã·ã§ã³ç°å¢ã®ãããªç´°ãããã©ã¡ã¼ã¿è¨å®ãå¿
è¦ã§ãæé»ã®è¨å®å¤ãé¿ããå ´å
ã»ããã¸ã§ã¯ããå§ã¾ã£ãã°ãããªã©ãä»å¾AWS以å¤ã®ãããªãã¯ã¯ã©ã¦ããæ±ãå¯è½æ§ãããå ´å