通过GitHub Actions和Python CDK部署到AWS

-3 投票
1 回答
74 浏览
提问于 2025-04-13 19:04

我正在处理一个项目,结构如下:

.
├── .github
│   └── workflows/
├── .gitignore
├── README.md
├── backend/
├── cdk
│   ├── .env
│   ├── .gitignore
│   ├── README.md
│   ├── __pycache__
│   ├── app.py
│   ├── cdk.context.json
│   ├── cdk.json
│   ├── cdk.out
│   ├── poetry.lock
│   ├── pyproject.toml
│   ├── schema.json
│   ├── settings.py
│   ├── stacks
│   └── tests
└── frontend/

这个 cdk 文件夹里有用 Python 写的 AWS CDK 代码。我想通过 GitHub Actions 来部署我的应用。我的工作流程文件放在 .github/workflows 文件夹里。目前我只有一个工作流程,因为我刚开始学习,它被设置为在我推送到 dev 分支时运行。具体的工作内容如下:

jobs:
  aws_cdk:

    permissions:
      contents: 'read'
      id-token: 'write'

    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Configure AWS credentials
        if: github.ref == 'refs/heads/dev'
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Run `cdk deploy`
        if: github.ref == 'refs/heads/dev'
        uses: youyo/aws-cdk-github-actions@v2
        env:
          AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID}}
        with:
          cdk_subcommand: 'deploy'
          cdk_stack: 'StreamingStack'
          cdk_version: 'latest'
          cdk_args: '--require-approval never'
          actions_comment: false
          working_dir: './cdk'

在执行 CDK deploy 的时候,出现了一个 ModuleNotFoundError 错误:

added 1 package in 856ms
Install aws-cdk latest
Successful install aws-cdk latest
Run cdk deploy --require-approval never "StreamingStack"
Traceback (most recent call last):
  File "/github/workspace/cdk/app.py", line 2, in <module>
    import aws_cdk as cdk
ModuleNotFoundError: No module named 'aws_cdk'

我使用 poetry 作为我的依赖管理工具,所以我决定在 CDK 部署步骤之前,往我的工作流程文件里添加以下步骤:

      - name: Install desired Python version
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: Install Poetry
        uses: snok/install-poetry@v1
        with:
          version: ${{ env.POETRY_VERSION }}
          virtualenvs-create: false
          virtualenvs-in-project: false

      - name: Install CDK dependencies
        run: |
          poetry config virtualenvs.create false
          poetry install --no-interaction --no-ansi --directory='./cdk'

编辑 - 这是我的 pyproject.toml 文件:

[tool.poetry]
name = "cdk"
version = "0.1.0"
description = ""
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"
aws-cdk-lib = "^2.115.0"
pydantic_settings = "^2.1.0"
"aws-amplify.cdk.exported-backend" = "^0.0.6"
constructs = ">=10.0.0,<11.0.0"


[tool.poetry.group.dev.dependencies]
pytest = "^7.4.3"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

可惜,错误还是没有解决。有没有人有什么想法?

1 个回答

0

经过大量调试,我找到了问题所在。这个 youyo/aws-cdk-github-actions@v2 的 GitHub 操作需要一个 requirements.txt 文件来安装依赖项:

function installPipRequirements(){
    if [ -e "requirements.txt" ]; then
        echo "Install requirements.txt"
        if [ "${INPUT_DEBUG_LOG}" == "true" ]; then
            pip install -r requirements.txt
        else
            pip install -r requirements.txt >/dev/null 2>&1
        fi

        if [ "${?}" -ne 0 ]; then
            echo "Failed to install requirements.txt"
        else
            echo "Successful install requirements.txt"
        fi
    fi
}

我从 pyproject.toml 文件创建了这个 requirements.txt 文件,然后让 GitHub 操作来安装所有的依赖项,这样问题就解决了。

撰写回答