簡體   English   中英

在本地機器上從 ubuntu (AWS EC2) 讀取文件?

[英]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

參考:終端截圖

技巧 1:從 EC2 下載文件時,通過存檔下載文件夾。

zip -r squash.zip /your/ec2/directory/

Hack 2:您可以通過以下命令將所有存檔文件從 ec2 下載到。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM