CDK包
aws-cdk.aws-ec2 aws-cdk.aws-ecs aws-cdk.aws-autoscaling aws-cdk.aws-elasticloadbalancingv2
CDK APP
#!/usr/bin/env python3 import os
from aws_cdk import core as cdk
? from aws_cdk import core
from liu_cdk.liu_cdk_stack import LiuStack from liu_cdk.bastion import BastionStack from liu_cdk.elbasg import Ec2Stack from ecs.ecs import EcsStack
app = core.App() vpc_stack=LiuStack(app, "VpcStack", ? ? ) BastionStack(app,"BastionStack1" , ? ? vpc=vpc_stack.vpc, ? ? sg_bastion = vpc_stack.sgbastion ? ? ) Ec2Stack(app ,"Ec2Stack", ? ? vpc=vpc_stack.vpc, ? ? ec2_sg = vpc_stack.sgecc, ? ? alb_sg = vpc_stack.sgalb, ? ?? ? ? ) EcsStack(app,"EcsStack", ? ? vpc = vpc_stack.vpc, ? ? )
app.synth() ?
CDK VPC
from aws_cdk import (core,aws_ec2 as ec2)
class LiuStack(core.Stack):
? ? def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None: ? ? ? ? super().__init__(scope, construct_id, **kwargs)
? ?? ? ? ? ? self.vpc = ec2.Vpc(self, "testvpc", ? ? ? ? ? ? #两个可用区 ? ? ? ? ? ? max_azs=2,? ? ? ? ? ? ? #CIDR地址池 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cidr="10.10.0.0/16", ? ? ? ? ? ?? ? ? ? ? ? ? #创建2个公网子网,两个私网子网,两个隔离子网? ? ? ? ? ? ? subnet_configuration=[ec2.SubnetConfiguration( ? ? ? ? ? ? ? ? ? ? subnet_type=ec2.SubnetType.PUBLIC, ? ? ? ? ? ? ? ? ? ? name="Public", ? ? ? ? ? ? ? ? ? ? cidr_mask=24 ? ? ? ? ? ? ? ? ), ec2.SubnetConfiguration( ? ? ? ? ? ? ? ? ? ? subnet_type=ec2.SubnetType.PRIVATE, ? ? ? ? ? ? ? ? ? ? name="Private", ? ? ? ? ? ? ? ? ? ? cidr_mask=24 ? ? ? ? ? ? ? ? ), ec2.SubnetConfiguration( ? ? ? ? ? ? ? ? ? ? subnet_type=ec2.SubnetType.ISOLATED, ? ? ? ? ? ? ? ? ? ? name="DB", ? ? ? ? ? ? ? ? ? ? cidr_mask=24 ? ? ? ? ? ? ? ? ) ? ? ? ? ? ? ? ? ], ? ? ? ? ? ? ? ? #两个nat网关 ? ? ? ? ? ? ? ? ? ? ? ? nat_gateways=2, ? ? ? ? ? ? ? ? ) ? ? ? ? ? ? ? ?? ? ? ? ? #创建alb安全组 ? ? ? ? ? ? ? ? self.sgalb = ec2.SecurityGroup(self,"sg_alb", ? ? ? ? ? ? ? ? #选择vpc ? ? ? ? ? ? ? ? vpc =self.vpc , ? ? ? ? ? ? ? ? #自定义安全组名称 ? ? ? ? ? ? ? ? security_group_name = "sg_alb", ? ? ? ? ? ? ? ? #默认关闭所有出站流量 ? ? ? ? ? ? ? ? allow_all_outbound = True ? ? ? ? ? ? ) ? ? ? ? ? ?? ? ? ? ? #alb接收所有地址的80端口访问 ? ? ? ? ? ? self.sgalb.connections.allow_from_any_ipv4(ec2.Port.tcp(80)) ? ? ? ?? ? ? ? ? #创建堡垒机安全组 ? ? ? ? self.sgbastion = ec2.SecurityGroup(self, "sg_bastion", ? ? ? ? ? ? vpc = self.vpc, ? ? ? ? ? ? security_group_name = "sg_bastion" , ? ? ? ? ? ? allow_all_outbound = True ? ? ? ? ? ? ) ? ? ? ? #堡垒机接受所有ip地址的22端口访问 ? ? ? ? self.sgbastion.connections.allow_from_any_ipv4(ec2.Port.tcp(22)) ? ? ? ?? ? ? ? ?? ? ? ? ? #创建ec2安全组? ? ? ? ? self.sgecc = ec2.SecurityGroup(self,"sg_ec2", ? ? ? ? ? ? vpc = self.vpc , ? ? ? ? ? ? security_group_name = "sg_ec2", ? ? ? ? ? ? allow_all_outbound = True ? ? ? ? ? ? ) ? ? ? ? ? ?? ? ? ? ? #安全组接收alb的7777端口流量 ? ? ? ? self.sgecc.connections.allow_from(self.sgalb,ec2.Port.tcp(7777)) ? ? ? ? #安全组接收堡垒机22端口访问 ? ? ? ? self.sgecc.connections.allow_from(self.sgbastion,ec2.Port.tcp(22)) ? ? ? ?? ? ? ? ? #创建rds安全组 ? ? ? ? self.sgrds = ec2.SecurityGroup(self,"sg_rds", ? ? ? ? ? ? vpc = self.vpc , ? ? ? ? ? ? security_group_name = "sg_rds" , ? ? ? ? ? ? allow_all_outbound = True ? ? ? ? ? ? ) ? ? ? ? ? ?? ? ? ? ? #rds接收ec2 3306端口访问 ? ? ? ? self.sgrds.connections.allow_from(self.sgecc,ec2.Port.tcp(3306)) ? ? ? ? #rds接收堡垒机3306端口访问 ? ? ? ? self.sgrds.connections.allow_from(self.sgbastion,ec2.Port.tcp(3306)) ? ? ? ?? ? ? ? ?? ? ? ? ? #efs安全组 ? ? ? ? sgnfs = ec2.SecurityGroup(self,"sg_efs", ? ? ? ? ? ? vpc = self.vpc , ? ? ? ? ? ? security_group_name = "sg_efs" , ? ? ? ? ? ? allow_all_outbound = True ? ? ? ? ? ? ) ? ? ? ? sgnfs.connections.allow_from(self.sgecc,ec2.Port.tcp(2049)) ? ? ? ?? ? ? ? ? #Memcached安全组 要接收ec2 11211 流量 ? ? ? ? sgMche = ec2.SecurityGroup(self,"sg_che", ? ? ? ? ? ? vpc = self.vpc, ? ? ? ? ? ? security_group_name = "sg_che", ? ? ? ? ? ? allow_all_outbound = True ? ? ? ? ? ? ) ? ? ? ? ? ?? ? ? ? ? sgMche.connections.allow_from(self.sgecc,ec2.Port.tcp(11211)) ? ? ? ?? ? ? ? ? #输出配置 ? ? ? ? core.CfnOutput(self, "Output_vpc", ? ? ? ? ? ? value=self.vpc.vpc_id) ? ? ? ? ? ?? ? ? ? ? core.CfnOutput(self,"Output_sgalb", ? ? ? ? ? ? value=self.sgalb.security_group_id) ? ? ? ?? ? ? ? ? core.CfnOutput(self,"Output_sgec2", ? ? ? ? ? ? value=self.sgecc.security_group_id) ? ? ? ?? ? ? ? ? core.CfnOutput(self,"Output_sgres", ? ? ? ? ? ? value=self.sgrds.security_group_id) ? ? ?? ? ? ? ? core.CfnOutput(self,"Outpur_sgbastionb", ? ? ? ? ? ? value=self.sgbastion.security_group_id) ??
CDK?Bastion
from aws_cdk import (core,aws_ec2 as ec2)
key_name="bastionkey" #CLI 创建密钥? # aws ec2 create-key-pair --key-name hello --query 'hello' --output text > hello.pem ??? ? # aws ec2 create-key-pair --key-name Bastion --query 'Bastion' --output text > Bastion.pem # aws ec2 create-key-pair --key-name MyKeyPair --query 'MyKeyPair' --output text > MyKeyPair.pem # aws ec2 delete-key-pair --key-name MyKeyPair
# efs 挂载工具 sudo yum install -y amazon-efs-utils ?&& mkdir /efs
class BastionStack(core.Stack):
? ? def __init__(self, scope: core.Construct, construct_id: str,vpc,sg_bastion, **kwargs) -> None: ? ? ? ? super().__init__(scope, construct_id, **kwargs) ? ? ? ?? ? ? ? ?? ? ? ? ? #堡垒机 ? ? ? ? # bastion = ec2.BastionHostLinux(self, "myBastion", ? ? ? ? # ? ? vpc=vpc, ? ? ? ? # ? ? subnet_selection=ec2.SubnetSelection( ? ? ? ? # ? ? ? ? subnet_type=ec2.SubnetType.PUBLIC), ? ? ? ? # ? ? instance_name="myBastionHostLinux", ? ? ? ? # ? ? instance_type=ec2.InstanceType(instance_type_identifier="t2.micro") , ? ? ? ? # ? ? security_group=sg_bastion ? ? ? ? # ? ? ) ? ? ? ? ? ?? ? ? ? ? ? ?? ? ? ? ? #使用ec2自制堡垒机 ? ? ? ? bastion = ec2.Instance(self,"myBastion", ? ? ? ? ? ? vpc = vpc, ? ? ? ? ? ? instance_name = "myBastionHostLinux", ? ? ? ? ? ? machine_image = ec2.MachineImage.latest_amazon_linux( ? ? ? ? ? ? ? ? generation = ec2.AmazonLinuxGeneration.AMAZON_LINUX_2), ? ? ? ? ? ? vpc_subnets = ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC), ? ? ? ? ? ? key_name = key_name, ? ? ? ? ? ? security_group = sg_bastion, ? ? ? ? ? ? instance_type=ec2.InstanceType(instance_type_identifier="t2.micro")? ? ? ? ? ? ? ) ? ? ? ?? ? ? ? ?? ? ? ? ? core.CfnOutput(self,"Outpur_bastion", ? ? ? ? ? ? value=bastion.instance_public_ip) ?
CDK elb
from aws_cdk import (core, ? ? aws_ec2 as ec2, ? ? aws_elasticloadbalancingv2 as elb, ? ? aws_autoscaling as autoscaling ? ? )
ec2_type = "t2.micro" #定义密钥 key_name = "hello"
#导入用户数据文件 with open("../userdata/data.sh") as f: ? ? user_data = f.read()
class Ec2Stack(core.Stack):
? ? def __init__(self, scope: core.Construct, construct_id: str,vpc,ec2_sg,alb_sg, **kwargs) -> None: ? ? ? ? super().__init__(scope, construct_id, **kwargs) ? ? ? ?? ? ? ? ?? ? ? ? ? #选择AMI镜像 ? ? ? ? ? ? ami_linux = ec2.MachineImage.latest_amazon_linux( ? ? ? ? ? ?? ? ? ? ? ? ? #选择第2代亚马逊linux ? ? ? ? ? ? generation = ec2.AmazonLinuxGeneration.AMAZON_LINUX_2, ? ? ? ? ? ? #选择linux版本有 minimal 和 standard 两种 ? ? ? ? ? ? edition = ec2.AmazonLinuxEdition.STANDARD, ? ? ? ? ? ? #选择虚拟化类型 有 HVM 和 PV ,可不配置默认HVM ? ? ? ? ? ? virtualization = ec2.AmazonLinuxVirt.HVM, ? ? ? ? ? ? #选择存储类型 EBS 和 GENERAL_PURPOSE ? ? ? ? ? ? storage = ec2.AmazonLinuxStorage.EBS ? ? ? ? ? ? ) ? ? ? ?? ? ? ? ? #创建alb ? ? ? ? alb = elb.ApplicationLoadBalancer(self,"helloALB", ? ? ? ? ? ? vpc =vpc, ? ? ? ? ? ? security_group=alb_sg, ? ? ? ? ? ? internet_facing=True, ? ? ? ? ? ? load_balancer_name="helloALB" ? ? ? ? ? ? ) ? ? ? ?? ? ? ? ? #监听80端口 ? ? ? ? listener = alb.add_listener("my80", ? ? ? ? ? ? port=80, ? ? ? ? ? ? open=True ? ? ? ? ? ? ) ? ? ? ?? ? ? ? ? #创建 AutoScaling组 ? ? ? ? asg = autoscaling.AutoScalingGroup(self,"myautoscaling", ? ? ? ? ? ? vpc = vpc, ? ? ? ? ? ? #实例启动在私网子网 ? ? ? ? ? ? vpc_subnets = ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE), ? ? ? ? ? ? #实例类型 ? ? ? ? ? ? instance_type=ec2.InstanceType(instance_type_identifier=ec2_type), ? ? ? ? ? ? #实例镜像 ? ? ? ? ? ? machine_image = ami_linux, ? ? ? ? ? ? #实例密钥 ? ? ? ? ? ? key_name =key_name, ? ? ? ? ? ? security_group=ec2_sg, ? ? ? ? ? ? #实例用户数据 ? ? ? ? ? ? user_data=ec2.UserData.custom(user_data), ? ? ? ? ? ? #需求2实例 ? ? ? ? ? ? desired_capacity=1, ? ? ? ? ? ? #最小与最大弹性伸缩 ? ? ? ? ? ? min_capacity=1, ? ? ? ? ? ? max_capacity=5 ? ? ? ? ? ? ) ? ? ? ? ? ?? ? ? ? ? ? ?? ? ? ? ? #创建alb目标组 ? ? ? ? listener.add_targets("addTargetGroup", ? ? ? ? ? ? protocol = elb.ApplicationProtocol.HTTP, ? ? ? ? ? ? port=7777, ? ? ? ? ? ?? ? ? ? ? ? ? #目标组为AutoScaling组 ? ? ? ? ? ? targets=[asg] ? ? ? ? ? ? ) ? ? ? ?? ? ? ? ? #输出alb的dns地址 ? ? ? ? core.CfnOutput(self,"Output", ? ? ? ? ? ? value=alb.load_balancer_dns_name ? ? ? ? ) ?
data.sh
#!/bin/bash -xe yum install -y wget wget https://yc-helloworld.s3.ap-northeast-1.amazonaws.com/server_demo -O /root/server_demo wget https://yc-helloworld.s3.ap-northeast-1.amazonaws.com/conf.toml -O /root/conf.toml chmod a+x /root/server_demo cd /root /root/server_demo
DOCKER
FROM centos
RUN yum install -y wget ? ?? RUN echo '#!/bin/bash -xe' > /opt/data.sh && \ ? ? echo 'wget https://yc-helloworld.s3.ap-northeast-1.amazonaws.com/server_demo -O /root/server_demo' >> /opt/data.sh && \ ? ? echo 'wget https://yc-helloworld.s3.ap-northeast-1.amazonaws.com/conf.toml -O /root/conf.toml' >> /opt/data.sh && \ ? ? echo 'chmod a+x /root/server_demo' >> /opt/data.sh && \ ? ? echo 'cd /root' ?>> /opt/data.sh && \ ? ? echo '/root/server_demo' ?>> /opt/data.sh && \ ? ? chmod 755 /opt/data.sh?
EXPOSE 7777
CMD ["/opt/data.sh" ,"-D FOREGROUND"] ?
|