python - 如何在 python lambda 函数中将文件从 S3 存储桶提交到 codecommit 存储库
问题描述
我需要使用 python lambda 函数以编程方式将文件从 S3 中的存储桶提交并推送到 codecommit 存储库。
我正在使用 boto3 库,首先我从存储桶中获取并解压缩 zip 文件,最后我循环每个文件并制作一个 put_file。
问题是 put_file 生成的提交与存储库中的文件一样多,但我只需要一个提交,因为我必须向 codebuild 发送一个通知。
我的 lambda 代码:
file_key = event['Records'][0]['s3']['object']['key']
obj = s3.get_object(Bucket=bucket_name, Key=file_key)
body_dec = base64.b64decode(obj['Body'].read())
memory_file = io.BytesIO(body_dec)
with zipfile.ZipFile(memory_file, 'r') as zf:
files = zf.namelist()
for individualFile in files:
data = zf.read(individualFile)
#get parentCommitId for nuew push
parentCommitId=""
try:
response = client.get_branch(
repositoryName='test-codecommit',
branchName='master'
)
parentCommitId= response['branch']['commitId']
except botocore.exceptions.ClientError as error:
print(error.response['Error'])
try:
if not parentCommitId:
#parentCommitId= None
response = client.put_file(
repositoryName='test-codecommit',
branchName='master',
fileContent=data,
filePath=individualFile,
commitMessage='tag1',
name='Javier',
email='jramirezneira@gmail.com'
)
else:
response = client.put_file(
repositoryName='test-codecommit',
branchName='master',
fileContent=data,
filePath=individualFile,
#fileMode='EXECUTABLE'|'NORMAL'|'SYMLINK',
parentCommitId=parentCommitId,
commitMessage='tag1',
name='Javier',
email='jramirezneira@gmail.com'
)
result.append({'file': individualFile, 'Message': 'Added to Codecommit'})
except botocore.exceptions.ClientError as error:
print(error.response['Error'])
result.append({'file': individualFile, 'Message': error.response['Error']['Message']})
我将感谢您的帮助或建议
解决方案
您可以使用 create_commit 而不是使用 put_file,它在 putFiles 参数中接收多个文件。我能够使用此代码来做到这一点-
def create_codecommit_repo_commit(repo_name, branch_name, code_folder):
client = boto3.client('codecommit')
parent_folder = os.path.join(code_folder, repo_name)
putFilesList = []
for (root, folders, files) in os.walk(parent_folder):
for file in files:
file_path = os.path.join(root, file)
with open(file_path, mode='r+b') as file_obj:
file_content = file_obj.read()
putFileEntry = {'filePath': str(file_path).replace(parent_folder, ''),
'fileContent': file_content}
putFilesList.append(putFileEntry)
response = client.create_commit(repositoryName=repo_name, branchName=branch_name, putFiles=putFilesList)
return response
推荐阅读
- angular - Angular - 如何将不同管道的结果传递给子组件
- ms-access - word mailmerge中与IF/OR Staement的多字段比较
- python - 如何在硒(python)中使用xpath获取元素的父母
- javascript - “无法读取未定义的属性‘用户’” discord.js 问题
- vb.net - VB.net 中的 DateTimePicker 工具显示一些红色标记
- python - Python Tensorflow 2.3.1 'utf-8' 编解码器无法解码字节,无效的继续字节。Unicode解码错误
- java - 使用数据提供者注释输入用户名和密码。在 selenium 中执行时出现 java.lang.ArrayIndexOutOfBoundsException 错误
- java - jdbctemplate 不关闭连接
- c# - .Contains() 仅检查 string[] .NET Core 3.1 的第一个元素
- c++ - Unordered map 有一个错误,指出函数本身在库 C++ 中不存在