我正在尝试利用AWS的API网关触发lambda函数,该函数将文件从源存储桶复制到目标存储桶。我希望API调用的形式为
https://some/api/url/my_lambda_function?key1=joe.mp4&key2=video-files&key3=edited-video-files
我设置了lambda函数。我附加了API网关并配置了API网关。问题是当我设置集成映射时。
当我运行https://some/api/url/my_lambda_function?key1="joe.mp4"&key2="video-files"&key3="edited-video-files"
时,一切正常。但是,如果我在不带引号的情况下运行它,则会出现错误。例如,如果我删除key3参数周围的引号,则错误为
{"message": "Could not parse request body into json: Unrecognized token \'edited\': was expecting (\'true\', \'false\' or \'null\')\n at [Source: (byte[])\"{\n \"key1\": \"joe.mp4\",\n \"key2\": \"video-files\",\n \"key3\": edited-video-files\n\n}\n\"; line: 4, column: 22]"}
这是我的设置。
在“ API网关”->“资源”->“集成请求”->“映射模板”下,我单击选项(未定义模板时)。我使用application / json,我的模板是:
{
"key1": $input.params('key1'),
"key2": $input.params('key2'),
"key3": $input.params('key3')
}
为了完整起见,我的Lambda是:
import boto3
def lambda_handler(event, context):
# initialize s3
s3 = boto3.client("s3")
# print event output
print(event)
FILENAME = event['key1']
SOURCE_BUCKET = event['key2']
DEST_BUCKET = event['key3']
# formatted copy string
copy_source = {
'Bucket': SOURCE_BUCKET,
'Key': FILENAME,
}
# copy files
s3.copy_object(Bucket=DEST_BUCKET, Key=FILENAME, CopySource=copy_source)
return 'Thanks for watching'
答案 0 :(得分:1)
如果我在映射模板键/值对中的值两边加上引号,那似乎行得通:
"key1": "$input.params('key1')",
"key2": "$input.params('key2')",
"key3": "$input.params('key3')"
}```
答案 1 :(得分:0)
如果要使用键/值对(例如key1 =“ joe.mp4”)传递url参数,则必须使用引号来定义该键的字符串值。
但是,您也可以为不需要引号的URL设置映射,而用斜杠(“ /”)as highlighted in this example隔开,但是这些映射不像键/值设置,因为它们必须遵循特定的顺序。
例如,使用键/值设置,您可以执行http://url?key1="value1"&key2="value2"&key3="value3"
,也可以执行http://url?key3="value3"&key1="value1"&key2="value2"
,它将得到相同的结果(请注意键的顺序)。但是,如果使用斜杠将静态参数分隔开,则无法执行此操作,所有值都必须以静态顺序http://url/value1/value2/value3