如何在 serverless.yaml 中为将在部署时创建的 ECR 添加资源策略?

问题描述 投票:0回答:1

我真的很想

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
    ),
  }
}
serverless serverless-framework amazon-ecr
1个回答
0
投票

建议的解决方案:

部署中的无服务器正在构建映像并将其推送到 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-*"
        }
      }
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.