AWS是一个提供广泛服务的云平台,这些服务可以协同工作,创建高度可扩展的应用。AWS在全球多个国家拥有许多数据中心集群,这些集群被称为区域。这些区域进一步细分为AZ或可用区。由于其庞大的全球覆盖范围,AWS常被许多拥有IT基础设施的公司使用。AWS提供的服务领域包括计算、存储、数据库和消息服务等。本文将聚焦于AWS最常用的服务之一——AWS Lambda。
AWS的计算服务允许开发计算应用程序并将它们部署到云端。AWS Lambda是其中一项服务,它是一种成本效益高的无服务器计算服务,意味着不需要预置或管理任何服务器。以Lambda函数的形式编写代码,AWS Lambda支持多种不同的运行时环境,因此可以用多种语言编写代码。AWS Lambda根据请求数量、函数使用的内存和代码运行的计算时间来计费,这使得Lambda对用户来说非常节省成本,因为不需要为未使用的资源付费。Lambda函数的一些常见用例包括处理上传到S3的对象、从API拉取数据的自动化、实时数据处理和日志分析。
AWS EC2是一项服务,允许创建具有多种操作系统和硬件配置选项的虚拟机。与AWS Lambda一样,它也是一种计算服务。可以决定哪种配置最适合应用程序,从4个CPU核心的虚拟机到64个CPU核心的虚拟机都可以选择。EC2实例适用于长期计算和需要较重工作负载的应用程序,而Lambda函数适用于需要短期计算的情况。对于EC2,需要选择满足要求的实例及其配置,但对于Lambda函数,不需要部署或管理任何VM实例。在AWS Lambda中,代码允许的最大计算时间是15分钟,而在EC2中,只要实例运行,脚本就可以计算任意长的时间。对于Lambda函数,开发人员只需要上传代码并设置触发Lambda函数脚本的触发器。可以选择一系列AWS服务作为触发Lambda函数的事件源。
现在将创建第一个Lambda函数。这个函数将从API拉取数据并将其存储在DynamoDB表中。将使用的API是Spotify API。使用这个API,将创建一个Lambda函数,每天从全球前50名榜单中获取数据并将其存储在NoSQL数据库中。在现实生活的行业项目中,很多时候需要自动化从API获取数据以存储数据的任务。
需要AWS账户才能使用其服务。需要Spotify账户,将在Spotify的开发者平台上创建一个应用程序以使用Spotify的API。
将首先在Spotify上创建一个开发者账户;需要凭据来使用python的Spotipy库连接到这个API。如果还没有Spotify账户,可以在open.spotify.com上创建一个。然后导航到developer.spotify.com/dashboard/并登录账户。在这里需要点击创建应用程序并写下它的名称和描述。之后,必须点击显示客户端密钥。看到的客户端ID和客户端密钥将是使用spotipy库连接到Spotify API的凭据。
在这一步中,将创建将保存数据的DynamoDB表。打开AWS控制台并登录账户。在搜索栏中输入DynamoDB并点击它。一旦到达仪表板,然后点击创建表。现在需要输入表名并选择一个分区键,它将是主键。在例子中,将键命名为“s_id”并选择了字符串数据类型。这个s_id将是将从Spotify API接收的歌曲_id。现在点击创建表,表将被创建。要查看表,可以从左侧面板转到表部分。
现在必须为Lambda函数创建一个IAM角色;这个IAM角色将允许Lambda函数向DynamoDB表添加数据。从AWS控制台的搜索栏导航到IAM页面。在左侧面板中,点击访问管理下的“角色”部分。一旦它打开,需要点击右侧的创建角色。选择AWS服务和Lambda,然后点击下一步。一旦这样做了,需要为这个角色指定权限,搜索DynamoDB并选择AmazonDynamoFullAccess策略。这个预定义的策略将允许Lambda连接到DynamoDB的表。点击下一步,命名IAM角色并点击创建。
现在将创建将调用API并更新DynamoDB表的Lambda函数。从搜索栏导航到Lambda仪表板并点击创建函数。命名函数并选择Python 3.9作为运行时环境。在权限标签下,必须点击现有角色并选择在前一步中创建的角色。现在需要点击创建函数。现在Lambda函数已经创建,需要为这个函数编写代码文件。将在本地系统上做这件事,并将代码文件上传为zip。为此,需要创建一个文件夹并给它命名。然后需要在这个文件夹内安装一些依赖项;为此,需要使用终端。在这个文件夹内打开终端并输入“pip install -t ./Spotipy”。还需要为示例安装pandas,所以应该也使用“pip install -t ./ pandas”来安装它。
在此之后,必须创建一个名为lambda_function.py的新文件,并在该文件中编写以下代码:
import json
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import boto3
from datetime import datetime
import pandas as pd
def lambda_handler(event, context):
Client_ID = "# Client ID"
Client_Secret = "# Client Secret"
credentials_client = SpotifyClientCredentials(client_id=Client_ID, client_secret=Client_Secret)
sp = spotipy.Spotify(client_credentials_manager=credentials_client)
top_50_global = sp.playlist("https://open.spotify.com/playlist/37i9dQZEVXbMDoHDwVN2tF")
timestamp = [item['added_at'] for item in top_50_global['tracks']['items']]
albums = [item['track']['album']['name'] for item in top_50_global['tracks']['items']]
artists = [[artists['name'] for artists in item['track']['album']['artists']] for item in top_50_global['tracks']['items']]
songs = [item['track']['name'] for item in top_50_global['tracks']['items']]
song_duration = [item['track']['duration_ms'] for item in top_50_global['tracks']['items']]
song_popularity = [item['track']['popularity'] for item in top_50_global['tracks']['items']]
s_id = [item['track']['id'] for item in top_50_global['tracks']['items']]
top_50_df = pd.DataFrame({
's_id' : s_id,
'timestamp' : timestamp,
'songs' : songs,
'albums' : albums,
'artists' : artists,
'duration' : song_duration,
'popularity' : song_popularity
})
dynamo_client = boto3.client('dynamodb')
for index, row in top_50_df.iterrows():
row = eval(row.to_json())
Item = {'s_id' : {'S': row['s_id']+str(datetime.now().date())}, 'timestamp' : {'S' : row['timestamp']}, 'songs' : {'S' : row['songs']},
'albums' : {'S' : row['albums']}, 'artists' : {'S' : str(row['artists'])}, 'duration' : {'S' : str(row['duration'])},
'popularity' : {'S' : str(row['popularity'])}}
dynamo_client.put_item(TableName='spotify', Item=Item)
return {
'statusCode': 200,
'body': json.dumps('Spotify Table Updated')
}