我真的很想
sls deploy
使用该资源的 ecr 策略,以便 Lambda 可以访问它。这是资源政策。我们的环境中有一个明确的拒绝,所以我也必须更新这一点。当我将资源策略直接应用于 ECR 时,它运行得非常好。
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "LambdaECRImageRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:DeleteRepositoryPolicy",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:SetRepositoryPolicy"
],
"Condition": {
"StringLike": {
"aws:sourceArn": "arn:aws:lambda:${aws:region}:${aws:accountId}:function:base-${self:provider.stage}*"
}
}
}
]
}
更多信息: 无服务器.yaml
service: lambda-hello
frameworkVersion: '3'
provider:
name: aws
region: us-east-1
ecr:
images:
appimage:
path: .
functions:
hello:
image:
name: appimage
还有我的函数代码(app.js):
"use strict"
module.exports.handler = async (event) => {
console.log("event", event)
return {
statusCode: 200,
body: JSON.stringify(
{
message: `Hello, world! Your function executed successfully!`,
},
null,
2
),
}
}
建议的解决方案:
部署中的无服务器正在构建映像并将其推送到 ECR。做到这一点不需要了解太多,它就可以工作。如果未找到 ECR 存储库,则会创建它;如果存储库存在并且已配置,它将使用它。这对于那些喜欢魔法的人来说是件好事。
要使用 serverless.yaml 配置它,有 2 个步骤。在为 lambda 配置provider.ecr 或图像选项之前,将您当前的项目(假设您已经部署了它)并将存储库放入基础架构中。使用无服务器部署堆栈,您现在在此 Cloud Formation 模板下拥有由无服务器管理的映像存储库。一旦你按下它,任何未来的图像配置都将使用它。
将 ECR 存储库命名为无服务器(传递选项?,或者,仅使用名称
serverless-<project-name>-<stage>
ECR 基础设施的未来更新现在将在此处进行并反映在您的部署中。
要根据上面的 hello-world 示例创建 ECR 基础设施,资源部分应如下所示:
resources:
Resources:
EcrRepository:
Properties:
RepositoryName: serverless-lambda-hello-dev
RepositoryPolicyText: ${file(./ecr-policy.json)}
Type: AWS::ECR::Repository
ecr-policy.json(用于阶段开发)
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "LambdaECRImageRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:DeleteRepositoryPolicy",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:SetRepositoryPolicy"
],
"Condition": {
"StringLike": {
"aws:sourceArn": "arn:aws:lambda:us-east-1:123456789012:function:*-dev-*"
}
}
}
]
}