如何使用 Elastic Beanstalk 创建“tmp”目录?
Posted
技术标签:
【中文标题】如何使用 Elastic Beanstalk 创建“tmp”目录?【英文标题】:How can I create a "tmp" directory with Elastic Beanstalk? 【发布时间】:2015-03-14 20:27:26 【问题描述】:我正在使用 Node.js,需要将文件保存到我的应用程序中的 tmp 目录。问题是 Elastic Beanstalk 没有将应用程序目录设置为可由应用程序写入。所以当我尝试创建临时目录时,我得到了这个错误
fs.js:653
return binding.mkdir(pathModule._makeLong(path),
^
Error: EACCES, permission denied '/var/app/tmp/'
at Object.fs.mkdirSync (fs.js:653:18)
at Promise.<anonymous> (/var/app/current/routes/auth.js:116:18)
at Promise.<anonymous> (/var/app/current/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
at Promise.emit (events.js:95:17)
at Promise.emit (/var/app/current/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
at Promise.fulfill (/var/app/current/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
at /var/app/current/node_modules/mongoose/lib/query.js:1394:13
at model.Document.init (/var/app/current/node_modules/mongoose/lib/document.js:250:11)
at completeOne (/var/app/current/node_modules/mongoose/lib/query.js:1392:10)
at Object.cb (/var/app/current/node_modules/mongoose/lib/query.js:1151:11)
我已经尝试了几件事,例如 .ebextensions/scripts/app-setup.sh 中的 app-setup.sh 脚本,看起来像这样
#!/bin/bash
# Check if this is the very first time that this script is running
if ([ ! -f /root/.not-a-new-instance.txt ]) then
newEC2Instance=true
fi
# Get the directory of 'this' script
dirCurScript=$(dirname "$BASH_SOURCE[0]")
# Fix the line endings of all files
find $dirCurScript/../../ -type f | xargs dos2unix -q -k
# Get the app configuration environment variables
source $dirCurScript/../../copy-to-slash/root/.elastic-beanstalk-app
export ELASTICBEANSTALK_APP_DIR="/$ELASTICBEANSTALK_APP_NAME"
appName="$ELASTICBEANSTALK_APP_NAME"
dirApp="$ELASTICBEANSTALK_APP_DIR"
dirAppExt="$ELASTICBEANSTALK_APP_DIR/.ebextensions"
dirAppTmp="$ELASTICBEANSTALK_APP_DIR/tmp"
dirAppData="$dirAppExt/data"
dirAppScript="$dirAppExt/scripts"
# Create tmp directory
mkdir -p $dirApp/tmp
# Set permissions
chmod 777 $dirApp
chmod 777 $dirApp/tmp
# Ensuring all the required environment settings after all the above setup
if ([ -f ~/.bash_profile ]) then
source ~/.bash_profile
fi
# If new instance, now it is not new anymore
if ([ $newEC2Instance ]) then
echo -n "" > /root/.not-a-new-instance.txt
fi
# Print the finish time of this script
echo $(date)
# Always successful exit so that beanstalk does not stop creating the environment
exit 0
除了在 .ebextensions 中创建一个名为 02_env.config 的文件,看起来像这样
# .ebextensions/99datadog.config
container_commands:
01mkdir:
command: "mkdir /var/app/tmp"
02chmod:
command: "chmod 777 /var/app/tmp"
似乎都不起作用。如何在我的应用程序中创建可写的 tmp 目录?
【问题讨论】:
只是好奇,为什么要在无状态系统中写入文件? 【参考方案1】:随着更新(当前?)Amazon Linux 2 elastic beanstalk 的安装,设置 Post Deploy 挂钩是实现这一点的方法。在 elastic beanstalk 将新部署的应用程序包移动到 /var/app 之后,需要创建 tmp 文件夹并使其可写。它只是一个 shell 脚本,位于应用根目录的以下位置:
.platform/hooks/postdeploy/10_create_tmp_and_make_writeable.sh
#!/bin/bash
mkdir /var/app/current/tmp
chmod 777 /var/app/current/tmp
【讨论】:
那么究竟需要做些什么来解决权限问题呢? @VictorNikitin - 如果您要部署到基于 amazon linux 2 的 Elastic Beanstalk 实例,请在 .platform/hooks/postdeploy/10_create_tmp_and_make_writeable.sh 的项目根目录中添加一个文件,其中包含三个上面的行脚本。 以前这个钩子路径是“/opt/elasticbeanstalk/hooks/appdeploy/post/filename.sh”。我们会尝试你的建议。谢谢。 Hook 运行正常,但脚本“chmod -R 777 /var/app/current/”因“权限被拒绝”而失败。如何允许应用程序写入应用程序文件夹? @VictorNikitin - 我不确定您是否可以递归地将整个应用程序目录设为 777。您可以尝试为应用程序目录中的 tmp 子目录执行此操作吗?像这样:试试脚本sudo mkdir /var/app/current/tmp sudo chmod 777 /var/app/current/tmp
【参考方案2】:
我最近在 .NET 应用程序中遇到了同样的问题,该应用程序由于无法写入目录而失败,即使在我设置了权限之后也是如此。
我发现在整个 .ebextensions 过程完成后,最后一步是 Web 容器权限更新,它最终覆盖了我的 ebextensions 权限更改。
为了解决这个问题,我将目录移到了 Web 容器之外,并更新了应用程序以改写在那里。
在你的情况下,我建议/tmp
【讨论】:
这对我帮助很大!我很犹豫是否将其标记为已接受的答案,因为它实际上并不能解决问题(应该可以写入应用程序目录),但如果没有提供其他答案,我会给你功劳。跨度>以上是关于如何使用 Elastic Beanstalk 创建“tmp”目录?的主要内容,如果未能解决你的问题,请参考以下文章
Elastic Beanstalk CLI,如何使用 RDS 实例创建环境?
如何让两个 Elastic Beanstalk 环境共享一个数据库实例
如何在 .ebextensions 配置中使用条件(AWS Elastic Beanstalk)