如何使用无服务器框架创建具有访问密钥和密钥的 IAM 用户?

How to create IAM user with access key and secret key using Serverless framework?

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

(类似 的东西是用 terraform 完成的)

您可以通过在 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

我想再次重申,像上面那样做是一个非常糟糕的主意 - 你应该依赖代入角色的临时凭证。

以下是如何添加已设置角色和权限的用户。设置角色和权限很重要,因为通常您不会在真空中使用 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'

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