在弹性 beantalk 部署之间维护 OAuth 密钥

Mantaining OAuth keys between elastic beanstalk deployment

我在 AWS Elastic Beanstalk 环境中有一个 laravel 应用程序 运行。我使用 Laravel Passport 来处理身份验证。

每次我 运行 eb deploy 键都会被删除,因为它不是版本控制文件的一部分(包含在 .gitignore 中)。因此,我必须在 EC2 实例中手动 运行 php artisan passport:keys 来生成密钥。但这将使所有用户需要重新登录,因为旧令牌现在无效,因为它是一个新的密钥对。

为我的配置提供一致的 oauth-public 和 oauth-private 密钥的最佳做法是什么?

我正在考虑将密钥包含到存储库中,但我认为不推荐这样做。

另一种方法是我生成一次密钥,然后将其上传到S3。然后有一个 post-部署脚本来检索 S3。

有没有更好的方法?

我昨天用 S3 设法解决了这个问题。

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["<BUCKET-NAME>"]
          roleName:
            "Fn::GetOptionSetting":
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"
  • 假设 A) 您的 S3 存储桶称为 <BUCKET-NAME> 并且 B) 您的 ElasticBeanstalk 环境中的 IAM 实例配置文件称为 aws-elasticbeanstalk-ec2-role
  • 现在您必须将文件添加到实例上的某个位置,您可以在其中访问它,您也可以自由选择位置。在您的 .config 文件中插入以下内容:
files:
    "/etc/keys/oauth-private.key":
        mode: "000755"
        owner: webapp
        group: webapp
        authentication: "S3Auth" # Notice, this is the same as specified in the Resources section
        source: "https://<BUCKET-NAME>.s3-<REGION>.amazonaws.com/<PATH-TO-THE-FILE-IN-THE-BUCKET>"
  • 现在要让它工作,您仍然需要授予对 IAM 实例配置文件 (aws-elasticbeanstalk-ec2-role) 的访问权限,因此您需要编辑存储桶的 ACL,如下所示:
{
    "Version": "2012-10-17",
    "Id": "BeanstalkS3Copy",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<ID>:role/aws-elasticbeanstalk-ec2-role"
            },
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket",
                "s3:GetObjectVersion",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<BUCKET-NAME>/*"
            ]
        }
    ]
}
  • 您可以转到 IAM 控制面板 > 角色 > aws-elasticbeanstalk-ec2-role 找到 IAM 实例配置文件的 ARN,然后复制角色 ARN

  • 在您的 Laravel 应用程序中,您必须使用 Passport::loadKeysFrom('/etc/keys')