如何在AWS Codecommit中创建文件?

问题描述 投票:0回答:1

我正在创建一个项目。该项目将在创建付款时记录付款详细信息。

import * as fs from 'fs/promises';
import * as path from 'path';
app.use('/files', async (req, res) => {
  const filePath = path.join(
    `log-files/test_${moment().format('YYYY-MM-DD')}.txt`
  );

  const value = 'TEST FILE CREATION IN AWS';

  try {
    await fs.readFile(filePath);

    await fs.appendFile(filePath, `\n\n${value}`);
    res.status(200).send(`File created in, ${filePath}`);
  } catch (error) {
    await fs.writeFile(filePath, value);
    console.log(error);
    res.status(200).send(`File created in, ${filePath}`);
  }
});

以上是我尝试过的代码。

这是我创建文件的脚本。它在本地运行良好,但在 AWS CodeCommit 中时, API调用成功并登录

File created in, log-files/test_2024-09-30.txt

但是当我检查存储库下的

log-files
文件夹时,它没有这个文件。

node.js typescript amazon-elastic-beanstalk aws-codecommit node.js-fs
1个回答
0
投票

您遇到的问题可能是由于您的本地环境以及 AWS CodeCommit 和部署环境的工作方式之间的差异造成的。这是一个解释和一些建议:

  1. CodeCommit 只是一个版本控制服务: CodeCommit 实际上并不运行您的代码或创建文件。它只是存储您的源代码。

  2. 文件系统差异: 当您的代码在 AWS 上运行时(可能在 EC2、ECS 或 Lambda 等服务中),它运行在与本地计算机不同的环境中。那里的文件系统与您的 CodeCommit 存储库是分开的。

  3. 临时文件系统: 许多 AWS 服务使用临时文件系统。这意味着在运行时创建的文件在实例或容器停止后不会保留。

  4. 权限: 运行代码的进程可能无权写入您指定的目录。

您可以尝试以下一些解决方案:

  1. 使用持久存储服务: 考虑使用 Amazon S3 等服务来存储日志文件,而不是写入本地文件系统。这是一个例子:

    import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
    import moment from 'moment';
    
    const s3Client = new S3Client({ region: "YOUR_REGION" });
    
    app.use('/files', async (req, res) => {
      const fileName = `test_${moment().format('YYYY-MM-DD')}.txt`;
      const value = 'TEST FILE CREATION IN AWS';
    
      try {
        const command = new PutObjectCommand({
          Bucket: "YOUR_BUCKET_NAME",
          Key: `log-files/${fileName}`,
          Body: value,
        });
    
        await s3Client.send(command);
        res.status(200).send(`File created in S3: log-files/${fileName}`);
      } catch (error) {
        console.error(error);
        res.status(500).send("Error creating file in S3");
      }
    });
    
  2. 使用日志服务: 考虑使用 AWS CloudWatch Logs 或第三方日志记录服务,而不是直接写入文件。

  3. 检查您的部署: 如果您确实需要写入本地文件系统,请确保您的部署过程包含

    log-files
    目录,并且您的应用程序对其具有写入权限。

  4. 使用特定于环境的路径: 使用环境变量在不同环境下设置不同的日志文件路径:

    const logPath = process.env.LOG_PATH || 'log-files';
    const filePath = path.join(logPath, `test_${moment().format('YYYY-MM-DD')}.txt`);
    
  5. 调试您的部署: 添加更多日志记录以准确查看文件在部署环境中写入的位置:

    console.log(`Attempting to write to: ${path.resolve(filePath)}`);
    

请记住,在部署到云环境时,直接在应用程序中写入文件通常不是一个好习惯。对于云原生应用程序来说,使用 S3 或专用日志服务等服务通常是更好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.