【发布时间】:2022-02-17 01:07:13
【问题描述】:
我想使用无服务器框架创建一个 IAM 用户以进行编程访问,并附加某些策略,并将其访问密钥 ID 和秘密密钥导出为 lambda 的环境变量。如何实现?
(类似here 是用 terraform 完成的)
【问题讨论】:
标签: amazon-iam serverless serverless-framework aws-serverless
我想使用无服务器框架创建一个 IAM 用户以进行编程访问,并附加某些策略,并将其访问密钥 ID 和秘密密钥导出为 lambda 的环境变量。如何实现?
(类似here 是用 terraform 完成的)
【问题讨论】:
标签: amazon-iam serverless serverless-framework aws-serverless
您可以通过在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 中部署声明的资源后,如何获取访问密钥的值?
以下是如何添加已设置角色和权限的用户。设置角色和权限很重要,因为通常您不会凭空创建具有 Access/Secret 密钥的用户,用户需要有一些访问权限。
注意事项:
SecretAccessKey。文件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'
如果用户、密钥和服务在一个文件中,则无需使用输出变量,您可以直接引用这些值。
【讨论】: