【问题标题】:How to create IAM user with access key and secret key using Serverless framework?如何使用无服务器框架创建具有访问密钥和密钥的 IAM 用户?
【发布时间】:2022-02-17 01:07:13
【问题描述】:

我想使用无服务器框架创建一个 IAM 用户以进行编程访问,并附加某些策略,并将其访问密钥 ID 和秘密密钥导出为 lambda 的环境变量。如何实现?

(类似here 是用 terraform 完成的)

【问题讨论】:

    标签: amazon-iam serverless serverless-framework aws-serverless


    【解决方案1】:

    您可以通过在resources 部分中编写原始 CloudFormation 来做到这一点:https://www.serverless.com/framework/docs/providers/aws/guide/resources

    但是,请注意 - 不建议将 AWS 访问密钥直接传递给 Lambda - 最好使用分配给 Lambda 的 IAM 角色来授予它适当的权限。

    编辑:如何访问它的示例

    provider:
      name: aws
      environment:
        ENVVAR:
          'Fn::GetAtt':
            - MyKey
            - SecretAccessKey
    
    resources:
      Resources:
        MyKey:
          Type: AWS::IAM::AccessKey
          Properties: 
            Serial: 0
            Status: Active
            UserName: username
    

    我想再次重申,执行上述操作是一个非常糟糕的主意 - 您应该改用假定角色的临时凭据。

    【讨论】:

    • 你能举个例子吗?从serverless.yml 中部署声明的资源后,如何获取访问密钥的值?
    • 这里您有访问密钥的文档 - docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/… 您可以使用 CF 内部函数再次引用它 - 我强烈建议不要使用通过环境传递给 Lambda 的 AWS 访问密钥 - 最好只使用依赖角色
    • 感谢您的回答,但您没有提供 serverless.yml 示例如何使用它。我之前看过该文档,但不清楚如何在 serverless.yml 文件的其他部分引用这些属性。我需要一个最小的工作示例而不是广泛的文档链接
    • 我在答案中添加了示例
    • 感谢您提供基本示例。您能否添加一个如何声明具有该访问密钥的 IAM 用户将有权访问的角色,因为这是最初的问题?非常感谢
    【解决方案2】:

    以下是如何添加已设置角色和权限的用户。设置角色和权限很重要,因为通常您不会凭空创建具有 Access/Secret 密钥的用户,用户需要有一些访问权限。

    注意事项:

    • 所有 IAM 资源都需要在名称中包含区域,因为重新部署具有相同名称的资源会导致“不可恢复的错误”(据 AWS IAM documentation 称)
    • 要引用访问密钥,您只需指定资源名称,但要引用秘密密钥,您需要获取属性SecretAccessKey
    • 策略中的示例权限授予对 SQS 队列的访问权限,但它可以是任何内容

    文件serverless-with-my-user.yml

    resources:
      Resources:
        # Naming an IAM resource can cause an unrecoverable error if you reuse the same template in multiple Regions
        MyUser:
          Type: AWS::IAM::User
          Properties:
            UserName: "my-${self:provider.stage}-${self:provider.region}-User"
            Policies:
            - PolicyName: 
                Fn::Join:
                  - ''
                  - - "myUser"
                    - '-'
                    - ${self:provider.stage}
                    - '-'
                    - ${self:provider.region}
                    - '-MyPolicy'
              PolicyDocument:
                Version: '2012-10-17'
                Statement:
                - Effect: Allow
                  Action:
                    - "sqs:GetQueueAttributes"
                    - "sqs:GetQueueUrl"
                  Resource: { 'Fn::ImportValue': '${self:provider.stage}-MyQueueArn' }
        MyUserKey:
          Type: AWS::IAM::AccessKey
          Properties: 
            UserName:
              Ref: MyUser
    
      Outputs:
        MyUserAccessKeyID:
          Description: The Access Key of the MyUser
          Value:
            Ref: MyUserKey
          Export:
            Name: ${self:provider.stage}-MyUserAccessKeyID
        MyUserAccessSecretKey:
          Description: The ARN of the secret key
          Value:
            Fn::GetAtt:
              - MyUserKey
              - SecretAccessKey
          Export:
            Name: ${self:provider.stage}-MyUserAccessSecretKey
    

    下面是如何在无服务器资源的其他部分(例如 lambda)中访问该用户的访问密钥和密钥:

    文件serverless-with-my-service.yml

    environment:
      MYUSER_AWS_ACCESS_KEY_ID:
        Fn::ImportValue: '${self:provider.stage}-MyUserAccessKeyID'
      MYUSER_AWS_SECRET_ACCESS_KEY:
        Fn::ImportValue: '${self:provider.stage}-MyUserAccessSecretKey'
    

    如果用户、密钥和服务在一个文件中,则无需使用输出变量,您可以直接引用这些值。

    【讨论】:

      猜你喜欢
      • 2019-06-22
      • 2019-10-16
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2017-12-29
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多