aws(学习笔记第十八课) 使用aws cdk(python)进行部署

aws(学习笔记第十八课)

  • 使用aws cdk(python)进行部署

学习内容:

  • 使用aws cdk(python)进行部署
  • 整体代码(python的通常工程)
  • 代码动作

1. 使用aws cdk(python)进行部署

  • aws cdk的整体架构
    前面使用了cloudformation进行了jsonaws的各种组件的定义和使用,但是对于熟悉开发语言程序员,不能进行灵活的使用开发语言(python,nodejs,java等等)进行灵活的aws组件的定义部署,实在是不能接受的,aws cdk满足了这方面的要求。
    使用aws cdk,可以使用各种熟悉的语言就行aws的部署,另外还避免了aws cloudformation的复杂json的代码编写。但是,底层来说,aws cdk还是会将写出的aws配置,最终转换成cloudformation,进行部署。

2. 整体代码(python的通常工程)

python为基础语言,开始开发aws cdk

  1. 环境准备

    需要以下的软件准备。

    • AWS CLI #最终执行的aws cdk的底层命令
    • AWS Account and User #最终执行的aws cdk的用户
    • Node.js #使用Node.js安装cdk
    • IDE for your programming language # 一般使用vs code
    • AWS CDK Toolkit # cdk的命令安装
    • Python # cdk的开发语言
  2. 各种软件安装详细

    • aws cli
      aws cli可以使用installer来安装。

    aws cli installer

    • AWS Account and User

      这里需要创建用户,用来执行cdk

    • Node.js
      nodejs

    • IDE for your programming language # 一般使用vs code

      这个比较通用,省略安装步骤。

    • AWS CDK Toolkit # cdk的安装

      shell 复制代码
      npm install -g aws-cdk
    • Python # cdk的开发语言

      安装开发语言Python
      python downloads

  3. 开始简单的aws cdk程序开发

    • 程序文件夹作成(使用git bash中执行)
      注意,没有特殊说明,执行的命令都是在项目的文件夹下

      shell 复制代码
      mkdir finlay_20241215 && cd finlay_20241215
    • 激活virtual environment venv

      shell 复制代码
      python -m venv .venv
      source .venv/Scripts/activate
    • 作成cdk的工程

      shell 复制代码
      cdk init app --language python
    • pipdownload url指向aliyun阿里云

      shell 复制代码
      pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
      pip config set install.trusted-host mirrors.aliyun.com
    • 编写cdkpython代码(finlay_20241215/app.py)

      python 复制代码
      #!/usr/bin/env python3
      import os
      import aws_cdk as cdk
      from aws_cdk import (
      	aws_ec2 as ec2,Stack
      )
      from constructs import Construct
      from finlay_20241215.finlay_20241215_stack import Finlay20241215Stack
      app = cdk.App()
      class Finlay20241215Stack(Stack):
      
          def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
              super().__init__(scope, construct_id, **kwargs)
      
              # VPC
              my_vpc = ec2.Vpc(
                  self,
                  id="my-vpc",
                  cidr="192.168.0.0/16",
                  nat_gateways=0, # NatGatewayを作成しない指定
                  subnet_configuration=[
                      ec2.SubnetConfiguration(
                          name="my-public-subnet",
                          subnet_type=ec2.SubnetType.PUBLIC,
                          cidr_mask=24
                      )
                  ]
              )
      
              # security group
              my_ec2_security_group = ec2.SecurityGroup(
                  self,
                  id="my-ec2-sg",
                  vpc=my_vpc,
                  allow_all_outbound=True,
                  security_group_name="my-ec2-sg"
              )
      
              # add ingress rule
              my_ec2_security_group.add_ingress_rule(
                  peer=ec2.Peer.ipv4("0.0.0.0/0"),
                  connection=ec2.Port.tcp(22),
                  description="allow ssh access"
              )
      
              #  set ami
              amzn_linux = ec2.MachineImage.latest_amazon_linux(
                  generation=ec2.AmazonLinuxGeneration.AMAZON_LINUX,
                  edition=ec2.AmazonLinuxEdition.STANDARD,
                  virtualization=ec2.AmazonLinuxVirt.HVM,
                  storage=ec2.AmazonLinuxStorage.GENERAL_PURPOSE,
                  cpu_type=ec2.AmazonLinuxCpuType.X86_64
              )
      
              # launch ec2 instance
              my_ec2_instance = ec2.Instance(
                  self,
                  id="my-ec2-instance",
                  instance_type=ec2.InstanceType.of(
                      ec2.InstanceClass.BURSTABLE2,
                      ec2.InstanceSize.MICRO
                  ),
                  machine_image=amzn_linux,
                  vpc=my_vpc,
                  vpc_subnets=ec2.SubnetSelection(
                      subnet_type=ec2.SubnetType.PUBLIC
                  ),
                  instance_name="my-ec2-instance",
                  security_group=my_ec2_security_group
              )
      Finlay20241215Stack(app, "Finlay20241215Stack")
      app.synth()
    • pip导入必须要的cdk依赖包

      shell 复制代码
      pip install -r requirements.txt
    • 执行cdk diff查看将要进行的cdk执行的差分

      shell 复制代码
      cdk diff

3. 代码动作

  1. 执行cdk bootstrap
    默认aws下,是没有执行cdk所需要的role的,第一次需要执行cdk bootstrap

    shell 复制代码
    cdk bootstrap


    之后检查awsrole作成情况。

  2. aws cli的用户附上权限
    这里,虽然已经自动生成了role来表示能够执行cdk,但是aws cli的执行用户还是没有能够sts:AssumeRoleassume这些role的权限。需要继续准备。

    • 选择aws cli用户,添加权限

      这里,选择创建内联权限

      选择JSON直接进行编辑

      权限JSON代码

      json 复制代码
      {
      	"Version": "2012-10-17",
      	"Statement": [
      		{
      			"Effect": "Allow",
      			"Action": [
      				"sts:AssumeRole"
      			],
      			"Resource": [
      				"arn:aws:iam::*:role/cdk-*"
      			]
      		}
      	]
      }

至此,aws cli的当前用户就能够执行cdk-开头的role,有权限执行aws cdk

  1. 执行deploy

    shell 复制代码
    cdk --require-approval never deploy

    默认需要承认(approval),会导致不执行部署,这里设置成--require-approval never

可以看到,这里还是通过cloudformation底层来实现aws服务的部署。

进入cloudformation之后,看到会出现stack

检查ec2 instance

最后清理cloudformation

相关推荐
贾贾20238 分钟前
什么是馈线自动化(FA)?其优点是什么?本文给出答案
运维·学习·自动化·能源·制造·信息与通信·智能硬件
热爱学习地派大星14 分钟前
Cadence笔记--原理图导入PCB
笔记·cadence
摸鱼仙人~33 分钟前
CBAM-2018学习笔记
pytorch·笔记·学习
五味香39 分钟前
Java学习,List移动元素
android·java·开发语言·python·学习·kotlin·list
佛州小李哥6 小时前
在亚马逊云科技上高效蒸馏低成本、高精度的Llama 3.1 405B模型(上篇)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
安冬的码畜日常7 小时前
【Vim Masterclass 笔记18】第八章 + S08L35:Vim 的可视化模式(二)
笔记·vim·自学笔记·vim可视化模式·vim可视模式·vim视觉模式
飞的肖7 小时前
nacos 主要的基础语法,零基础学习
java·学习·nacos
摸鱼仙人~8 小时前
EPSANet2021笔记
笔记
小殷要努力刷题!9 小时前
JavaWeb项目——如何处理管理员登录和退出——笔记
java·javascript·笔记·学习·servlet·javaweb·寒假
?-ldl10 小时前
docker使用笔记
笔记·docker·容器