[英]reading in a file from ubuntu (AWS EC2) on local machine?
我有一個在 AWS 上運行的 python 腳本(帶有 Ubuntu 的 EC2 實例)。 這個 python 腳本每天輸出一個 JSON 文件到 /home/ubuntu 中的目錄:
with open("/home/ubuntu/bandsintown/sf_events.json", "w") as writeJSON:
file_str = json.dumps(allEvents, sort_keys=True)
file_str = "var sf_events = " + file_str
一切都按預期在這里工作。 我的問題是我不確定如何將這個 JSON(存在於 ubuntu 上)讀取到我在本地機器上運行的 javascript 文件中。
如果我從 ubuntu 調用文件,Javascript 找不到該文件:
<script src="/home/ubuntu/bandsintown/sf_events.json"></script>
換句話說,我想讀取我在雲中創建的 JSON 到我本地機器上存在的文件。 我應該在 home/ubuntu 以外的其他地方輸出 JSON 嗎? 或者,我的本地文件能否以某種方式將 /home/ubuntu 識別為文件位置?
提前致謝。
出現問題是因為該文件不存在於您的本地計算機上,僅存在於正在運行的 EC2 實例上。 一種可能的解決方案是將 JSON 文件從 EC2 實例上傳到 S3,然后將 JSON 文件下載到您的本地機器/home/ubuntu/bandsintown/sf_events.json
。
首先,在運行 EC2 實例的AWS CLI上安裝 AWS CLI 工具包並在終端中運行以下命令
aws configure
aws s3 cp /home/ubuntu/bandsintown/sf_events.json s3://mybucket/sf_events.json
或者安裝 Python AWS SDK boto3並通過 python 上傳
s3 = boto3.resource('s3')
def upload_file_to_s3(s3_path, local_path):
bucket = s3_path.split('/')[2] #bucket is always second as paths are S3://bucket/.././
file_path = '/'.join(s3_path.split('/')[3:])
response = s3.Object(bucket, file_path).upload_file(local_path)
return response
s3_path = "s3://mybucket/sf_events.json"
local_path = "/home/ubuntu/bandsintown/sf_events.json"
upload_file_to_s3(s3_path, local_path)
然后在您的本地機器上通過 AWS CLI 從 s3 下載文件
aws configure
aws s3 cp s3://mybucket/sf_events.json /home/ubuntu/bandsintown/sf_events.json
或者,如果您更喜歡 python SDK:
s3 = boto3.resource('s3')
def download_file_from_s3(s3_path, local_path):
bucket = s3_path.split('/')[2] #bucket is always second as paths are S3://bucket/.././
file_path = '/'.join(s3_path.split('/')[3:])
filename = os.path.basename(s3_path)
s3.Object(bucket, file_path).download_file(local_file_path)
s3_path = "s3://mybucket/sf_events.json"
local_path = "/home/ubuntu/bandsintown/sf_events.json"
download_file_from_s3(s3_path, local_path)
或者使用在瀏覽器中運行的 Javascript SDK,但我不推薦這樣做,因為您必須公開您的存儲桶並注意瀏覽器兼容性問題
您可以使用 aws S3
您可以在您的實例上運行一個 python 腳本,該腳本在生成 json 時將 json 文件上傳到 s3,並在您可以使用的本地計算機上運行另一個 python 腳本(用於 sqs 隊列和 s3 下載配置的腳本)或(下載最新文件的腳本)上傳到 s3 存儲桶)。
情況1:
每當 json 文件上傳到 S3 時,您都會在 sqs 隊列中收到消息,該文件已上傳到 s3,然后文件將下載到您的本地計算機。
案例2:
每當 json 文件上傳到 s3 時,您都可以運行下載腳本來下載最新的 json 文件。
上傳.py:
import boto3
import os
import socket
def upload_files(path):
session = boto3.Session(
aws_access_key_id='your access key id',
aws_secret_access_key='your secret key id',
region_name='region'
)
s3 = session.resource('s3')
bucket = s3.Bucket('bucket name')
for subdir, dirs, files in os.walk(path):
for file in files:
full_path = os.path.join(subdir, file)
print(full_path[len(path)+0:])
with open(full_path, 'rb') as data:
bucket.put_object(Key=full_path[len(path)+0:], Body=data)
if __name__ == "__main__":
upload_files('your pathwhich in your case is (/home/ubuntu/)')
您在本地機器上的其他腳本:
帶有 sqs 隊列的 download1.py
import boto3
import logzero
from logzero import logger
s3_resource = boto3.resource('s3')
sqs_client=boto3.client('sqs')
### Queue URL
queue_url = 'queue url'
### aws s3 bucket
bucketName = "your bucket-name"
### Receive the message from SQS queue
response_message = sqs_client.receive_message(
QueueUrl=queue_url,
MaxNumberOfMessages=1,
MessageAttributeNames=[
'All'
],
)
message=response_message['Messages'][0]
receipt_handle = message['ReceiptHandle']
messageid=message['MessageId']
filename=message['Body']
try:
s3_resource.Bucket(bucketName).download_file(filename,filename)
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code']=='404':
logger.info("The object does not exist.")
else:
raise
logger.info("File Downloaded")
從 s3 下載最新文件的 download2.py:
import boto3
### S3 connection
s3_resource = boto3.resource('s3')
s3_client = boto3.client('s3')
bucketName = 'your bucket-name'
response = s3_client.list_objects_v2(Bucket=bucketName)
all = response['Contents']
latest = max(all, key=lambda x: x['LastModified'])
s3 = boto3.resource('s3')
key=latest['Key']
print("downloading file")
s3_resource.Bucket(bucketName).download_file(key,key)
print("file download")
您基本上需要將文件從遠程機器復制到本地機器。 最簡單的方法是使用scp
。 在以下示例中,它只是復制到您的當前目錄。 如果您使用的是 Windows,請打開 PowerShell,如果您使用的是 Linux,則應該已經安裝了scp
。
scp <username>@<your ec2 instance host or IP>:/home/ubuntu/bandsintown/sf_events.json ./
運行命令,輸入密碼,完成。 與使用ssh
連接到遠程計算機的方式相同。 (我相信你的用戶名是ubuntu
)
更高級的方法是通過SSHFS 掛載遠程目錄。 設置起來有點麻煩,但是您可以像訪問本地文件一樣即時訪問遠程文件。
如果您想從 Python 中務實地做到這一點,請參閱此問題。
將文件從本地復制到 EC2
您的私鑰不得公開可見。 運行以下命令,以便只有 root 用戶可以讀取文件。
chmod 400 yourPublicKeyFile.pem
要在您的計算機和您的實例之間復制文件,您可以使用 FileZilla 等 FTP 服務或命令 scp。 “scp”的意思是“安全復制”,它可以在網絡上的計算機之間復制文件。 您可以在 Unix/Linux/Mac 系統上的終端中使用此工具。
要將 scp 與密鑰對一起使用,請使用以下命令:
scp -i /directory/to/abc.pem /your/local/file/to/copy user@ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com:path/to/file
您需要指定正確的 Linux 用戶。 來自 Amazon:對於 Amazon Linux,用戶名為 ec2-user。 對於 RHEL,用戶名為 ec2-user 或 root。 對於 Ubuntu,用戶名是 ubuntu 或 root。 對於 Centos,用戶名為 centos。 對於 Fedora,用戶名為 ec2-user。 對於 SUSE,用戶名為 ec2-user 或 root。 否則,如果 ec2-user 和 root 不起作用,請與您的 AMI 提供商聯系。 要在沒有密鑰對的情況下使用它,只需省略標志 -i 並在提示時輸入用戶的密碼。
注意:您需要確保用戶“user”具有在目標目錄中寫入的權限。 在這個例子中,如果 ~/path/to/file 是由用戶“user”創建的,應該沒問題。 將文件從 EC2 復制到本地要將 scp 與密鑰對一起使用,請使用以下命令:
scp -i /directory/to/abc.pem user@ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com:path/to/file /your/local/directory/files/to/download
參考:終端截圖
zip -r squash.zip /your/ec2/directory/
scp -i /directory/to/abc.pem user@ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com:~/* /your/local/directory/files/to/download
您是否考慮過為此使用 EFS? 您可以 通過 VPN 或直接連接在 ec2 和 本地計算機上安裝 EFS 嗎? 您不能將文件保存在 EFS 上以便兩個來源都可以訪問它嗎?
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.