AWS S3 存储桶在将 EC2 从 t2.micro 升级到 t2.nano 后停止工作

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

在 AWS 上,我已将 EC2 实例从 t2.micro(免费)迁移到 t2.nano 以获得更多 CPU 周期。那时,除了实例类型外,我在 AWS EC2 控制台中没有做任何更改。它启动速度更快,但我的 s3fs 存储桶无法保持安装状态。

我需要 S3 桶在启动时可靠地挂载并保持挂载状态。

环境:

# uname --all
Linux localhost 5.15.0-1033-aws #37~20.04.1-Ubuntu SMP Fri Mar 17 11:39:30 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

# s3fs --version
Amazon Simple Storage Service File System V1.86 (commit:unknown) with GnuTLS(gcrypt)

更多详情:

我有两个 s3 存储桶,从设置此 EC2 实例开始,它们在启动时自动挂载 (/etc/fstab) 时出现问题。作为解决方法,我创建了一个 remount.sh 脚本来挂载它们,如果我在重新启动后手动运行它几次,它工作得很好。

那个脚本在这里:

# cat remount.sh
#!/bin/bash
echo "Before remount"
mount -l | grep s3fs

echo "Unmounting....."
umount /mnt/ftpusers
umount /mnt/random

echo "Mounting....."
s3fs -f -d s3-bucket-1 /mnt/ftpusers -o passwd_file=/root/.passwd-s3fs -o url=https://s3.us-east-2.amazonaws.com -o use_path_request_style -o allow_other -o nonempty >> /var/log/s3fs.log &
s3fs -f -d s3-bucket-2 /mnt/random -o passwd_file=/root/.passwd-s3fs -o url=https://s3.us-east-2.amazonaws.com -o use_path_request_style -o allow_other -o nonempty >> /var/log/s3fs.log &

echo "After remount"
#Duplicate lines because it takes a sec sometimes.
mount -l | grep s3fs
mount -l | grep s3fs

在未安装任何内容的情况下运行脚本之前:(我的文件权限是否正确?)

# ls -la /mnt
total 9
drwxr-xr-x  4 root root 4096 Dec 13  2020 .
drwxr-xr-x 23 root root 4096 Apr  2 19:27 ..
drwxrwxrwx  1 root root    0 Jan  1  1970 ftpusers
drwxrwxrwx  1 root root    0 Jan  1  1970 random

在 ftpusers 子文件夹和文件上尝试一些文件操作后,我收到一些错误(见下文),这就是我在 /mnt/ 目录中看到的。如果我对 /mnt/random/ 文件夹做同样的事情,它也会使挂载崩溃。

# ls -la /mnt
ls: cannot access '/mnt/ftpusers': Transport endpoint is not connected
total 9
drwxr-xr-x  4 root root 4096 Dec 13  2020 .
drwxr-xr-x 23 root root 4096 Apr  2 19:27 ..
d?????????  ? ?    ?       ?            ? ftpusers
drwxrwxrwx  1 root root    0 Jan  1  1970 random

运行脚本后:

# ~/lpr-scripts/remount.sh
Before remount
s3fs on /mnt/ftpusers type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
s3fs on /mnt/random type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
Unmounting.....
Mounting.....
After remount
s3fs on /mnt/ftpusers type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
s3fs on /mnt/random type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)

我遇到了很多这样的错误

Software caused connection abort
find: Failed to restore initial working directory: Transport endpoint is not connected
0
find: ‘./xxxxxxx’: Transport endpoint is not connected
find: Failed to restore initial working directory: /mnt/ftpusers: Transport endpoint is not connected

在 /var/log/s3fs 中,我在运行“remount.sh”时看到了这种情况:

# cat /var/log/s3fs.log
[CRT] s3fs.cpp:set_s3fs_log_level(297): change debug level from [CRT] to [INF]
[INF]     s3fs.cpp:set_mountpoint_attribute(4400): PROC(uid=0, gid=0) - MountPoint(uid=0, gid=0, mode=40755)
[INF] s3fs.cpp:s3fs_init(3493): init v1.86(commit:unknown) with GnuTLS(gcrypt)
[INF] s3fs.cpp:s3fs_check_service(3828): check services.
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[ERR] curl.cpp:RequestPerform(2431): HTTP response code 400, returning EIO. Body Text: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>Y69Q62MK4A6VA0QC</RequestId><HostId>4ReUR9oaB7EUBWRcZWdOlcsC6oX1HcpfcC9OJaMN2d16kfi1Yg3mH/EwV8T86rg4iN8Y6i49C30=</HostId></Error>
[ERR] curl.cpp:CheckBucket(3439): Check bucket failed, S3 response: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>Y69Q62MK4A6VA0QC</RequestId><HostId>4ReUR9oaB7EUBWRcZWdOlcsC6oX1HcpfcC9OJaMN2d16kfi1Yg3mH/EwV8T86rg4iN8Y6i49C30=</HostId></Error>
[CRT] s3fs.cpp:s3fs_check_service(3862): Failed to connect region 'us-east-1'(default), so retry to connect region 'us-east-2'.
[INF] curl.cpp:ReturnHandler(318): Pool full: destroy the oldest handler
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[INF]       curl.cpp:RequestPerform(2416): HTTP response code 200
[INF] s3fs.cpp:s3fs_getattr(876): [path=/]
[INF] s3fs.cpp:s3fs_destroy(3546): destroy
[CRT] s3fs.cpp:set_s3fs_log_level(297): change debug level from [CRT] to [INF]
[INF]     s3fs.cpp:set_mountpoint_attribute(4400): PROC(uid=0, gid=0) - MountPoint(uid=0, gid=0, mode=40755)
[INF] s3fs.cpp:s3fs_init(3493): init v1.86(commit:unknown) with GnuTLS(gcrypt)
[INF] s3fs.cpp:s3fs_check_service(3828): check services.
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[ERR] curl.cpp:RequestPerform(2431): HTTP response code 400, returning EIO. Body Text: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>Y69H328JJFKYMRRZ</RequestId><HostId>+laHSpHkzT5+iuuc15w1eZB9yxdTuzLerhvioM01hKf8lG6GoYaNL788NADH6HIHGuhtNf9S9JY=</HostId></Error>
[ERR] curl.cpp:CheckBucket(3439): Check bucket failed, S3 response: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>Y69H328JJFKYMRRZ</RequestId><HostId>+laHSpHkzT5+iuuc15w1eZB9yxdTuzLerhvioM01hKf8lG6GoYaNL788NADH6HIHGuhtNf9S9JY=</HostId></Error>
[CRT] s3fs.cpp:s3fs_check_service(3862): Failed to connect region 'us-east-1'(default), so retry to connect region 'us-east-2'.
[INF] curl.cpp:ReturnHandler(318): Pool full: destroy the oldest handler
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[INF]       curl.cpp:RequestPerform(2416): HTTP response code 200
[INF] s3fs.cpp:s3fs_getattr(876): [path=/]
[INF] s3fs.cpp:s3fs_destroy(3546): destroy
[CRT] s3fs.cpp:set_s3fs_log_level(297): change debug level from [CRT] to [INF]
[INF]     s3fs.cpp:set_mountpoint_attribute(4400): PROC(uid=0, gid=0) - MountPoint(uid=0, gid=0, mode=40755)
[INF] s3fs.cpp:s3fs_init(3493): init v1.86(commit:unknown) with GnuTLS(gcrypt)
[INF] s3fs.cpp:s3fs_check_service(3828): check services.
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[ERR] curl.cpp:RequestPerform(2431): HTTP response code 400, returning EIO. Body Text: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>FXAPN5DG1J0A2B2P</RequestId><HostId>JaaZCGoE40faMlIygOJpgk3Lsh9rgep3OIg1yMcWXiFKQDUDrz/WCM5NpA6dcg5ipjibdfHPOLQ=</HostId></Error>
[ERR] curl.cpp:CheckBucket(3439): Check bucket failed, S3 response: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>FXAPN5DG1J0A2B2P</RequestId><HostId>JaaZCGoE40faMlIygOJpgk3Lsh9rgep3OIg1yMcWXiFKQDUDrz/WCM5NpA6dcg5ipjibdfHPOLQ=</HostId></Error>
[CRT] s3fs.cpp:s3fs_check_service(3862): Failed to connect region 'us-east-1'(default), so retry to connect region 'us-east-2'.
[INF] curl.cpp:ReturnHandler(318): Pool full: destroy the oldest handler
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-1/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[INF]       curl.cpp:RequestPerform(2416): HTTP response code 200
[INF] s3fs.cpp:s3fs_getattr(876): [path=/]
[INF] s3fs.cpp:s3fs_destroy(3546): destroy
[CRT] s3fs.cpp:set_s3fs_log_level(297): change debug level from [CRT] to [INF]
[INF]     s3fs.cpp:set_mountpoint_attribute(4400): PROC(uid=0, gid=0) - MountPoint(uid=0, gid=0, mode=40755)
[INF] s3fs.cpp:s3fs_init(3493): init v1.86(commit:unknown) with GnuTLS(gcrypt)
[INF] s3fs.cpp:s3fs_check_service(3828): check services.
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[ERR] curl.cpp:RequestPerform(2431): HTTP response code 400, returning EIO. Body Text: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>FXAZD71YBT9H4RGE</RequestId><HostId>A8MaZ/GWhiDrfHTrrCK7jCbzobrgi7josatwwSlTI57XOPj5yGoD6uAqsdDgOowxgrO33ixymHk=</HostId></Error>
[ERR] curl.cpp:CheckBucket(3439): Check bucket failed, S3 response: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>FXAZD71YBT9H4RGE</RequestId><HostId>A8MaZ/GWhiDrfHTrrCK7jCbzobrgi7josatwwSlTI57XOPj5yGoD6uAqsdDgOowxgrO33ixymHk=</HostId></Error>
[CRT] s3fs.cpp:s3fs_check_service(3862): Failed to connect region 'us-east-1'(default), so retry to connect region 'us-east-2'.
[INF] curl.cpp:ReturnHandler(318): Pool full: destroy the oldest handler
[INF]       curl.cpp:CheckBucket(3413): check a bucket.
[INF]       curl.cpp:prepare_url(4703): URL is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:prepare_url(4736): URL changed is https://s3.us-east-2.amazonaws.com/s3-bucket-2/
[INF]       curl.cpp:insertV4Headers(2753): computing signature [GET] [/] [] []
[INF]       curl.cpp:url_to_host(99): url is https://s3.us-east-2.amazonaws.com
[INF]       curl.cpp:RequestPerform(2416): HTTP response code 200
[INF] s3fs.cpp:s3fs_getattr(876): [path=/]
[INF] s3fs.cpp:s3fs_destroy(3546): destroy

我看到错误区域的错误。所以我检查一下:

# cat ~/.aws/config
[default]
region = us-east-2
output = text

顺便说一句,我以 root 身份手动运行它,而我不确定 /etc/fstab 在启动时以哪个用户身份运行。

另一个奇怪的问题是

~root/.passwd-s3fs
文件与
~root/.aws.credentials
文件不匹配,但它整天都在不同的EC2实例上工作。此时,我不确定哪个 S3 凭据是正确的。这可能是我的问题,但我已经更改了两个凭据(
~root/.passwd-s3fs
~root/.aws/credentials
)以匹配并且它似乎根本无法连接。我对这里的这一点很困惑。一个会覆盖另一个吗?它们什么时候使用? (仅在初始挂载时,或每个文件读/写等?)

启动时

/etc/fstab
的 AWS s3fs 凭证和配置存储在哪里?

预先感谢您和我一起看这个。

amazon-web-services amazon-s3 amazon-ec2 mount
© www.soinside.com 2019 - 2024. All rights reserved.