将角色分配给 .ebextensions 中的实例

Assign role to instance in .ebextensions

tl;dr 实例获得假定角色,而不是我在配置中设置的角色。

我在 docker 中部署了一个 java 应用程序到 elastic-beanstalk 中;我实际上在 .ebextensions/instance.config:

中使用我的自定义策略设置了特定角色
  - namespace: aws:autoscaling:launchconfiguration
    option_name: IamInstanceProfile
    value: custom-profile

当我使用 eb init && eb create --tier worker 部署时一切正常。然后应用程序尝试访问 custom-profile 中允许的内容,但它失败了:

Exception in thread "main" com.amazonaws.AmazonServiceException: User: arn:aws:sts::***:assumed-role/aws-elasticbeanstalk-ec2-role/*** is not authorized to perform: ...

它甚至没有提到它使用 "assumed role" 的原因。有趣的是,当我在 Web 控制台中手动设置角色并上传 zip 时,它起作用了。

我试过使用 SingleInstance 和 LoadBalanced,两者的结果相同。我已阅读 docs 并用谷歌搜索,但没有发现任何有用的东西。我已经将 PassRole 权限添加到我的控制台用户,但我什至不知道它是否有帮助。该配置被认为是有效的,但是在创建 EC2 实例时我没有任何信息说明为什么它没有被分配正确的角色。

非常感谢您的建议。

注:new InstanceProfileCredentialsProvider()用于Java。

两种可能

您是否将 .ebextension 文件提交到 git 存储库?很可能你做了,但只是仔细检查。

另一种可能性是,当您 运行 eb init 和 eb create 时,它​​会在不同的 conf 文件中为您设置默认值。这些默认值包括 IamInstanceProfile。在交互模式下,您可以选择角色名称,否则它会选择默认名称。 eb 通过 api 传递默认选项设置。您的 ebextensions 还指定了具有不同值的相同选项设置。如果发生冲突,api 获胜并覆盖您的 ebextension 中的歌曲。我认为这就是可能发生的事情。您可以尝试在交互模式下调用 eb init/create 时指定您的角色名称吗?这样您的角色将被使用而不是默认角色。

EB CLI 告诉 Elastic Beanstalk 使用 "aws-elasticbeanstalk-ec2-role" 实例配置文件。这将覆盖您的 ebextensions。 为了使用您自己的配置文件,您可以使用“-ip”选项,也可以使用默认保存的配置。

eb create --tier worker -ip custom-profile

如果您想使用保存的配置执行此操作,请参阅 this blog post