使用 ClourdFormation 部署 ElasticBeanstalk 环境

问题描述

我有以下 CF 模板来部署 EB 环境:

Resources:

  EBEC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service:
                - 'ec2.amazonaws.com'
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier'
        - 'arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier'
        - 'arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker'
      RoleName: 'aws-elasticbeanstalk-ec2-role'


  EBServiceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service:
                - 'elasticbeanstalk.amazonaws.com'
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth'
        - 'arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkService'
      RoleName: 'aws-elasticbeanstalk-service-role'

  EBApplication:
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      ApplicationName: 'Freyja'
      Description: 'Freyja EB Application'

  EBAppVersion:
    Type: AWS::ElasticBeanstalk::ApplicationVersion
    Properties:
      ApplicationName:
        Ref: EBApplication
      Description: 'App version'
      SourceBundle:
        S3Bucket:
          Fn::ImportValue:
                  Fn::Sub: 'S3MainBucket'
        S3Key: 'python.zip'

  EBEnv:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName:
        Ref: EBApplication
      Description: 'Freyja main environment'
      EnvironmentName: 'Freyja'
      SolutionStackName: '64bit Amazon Linux 2 v3.1.4 running Python 3.7'
      OptionSettings:
        - Namespace: 'aws:autoscaling:launchconfiguration'
          OptionName: 'InstanceType'
          Value: 't2.nano'
        - Namespace: 'aws:autoscaling:launchconfiguration'
          OptionName: 'IamInstanceProfile'
          Value: !Ref EBEC2Role
        - Namespace: 'aws:elasticbeanstalk:environment'
          OptionName: 'ServiceRole'
          Value: !Ref EBServiceRole
      VersionLabel:
        Ref: EBAppVersion

但是,我在 CF 中创建它时不断收到错误

环境无法启动,因为它进入终止状态

我查阅了大量文档,但似乎无法找到造成这种情况的原因。请记住,这个想法是在一个全新的帐户中部署它,这就是我在模板中创建角色的原因,除了一个单独的 CF 模板来创建 S3 存储桶之外,它没有任何内容

谢谢!

解决方法

这可能是因为 IamInstanceProfile 应该是实例配置文件,而不是角色。所以你可以添加如下:

  EBInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties: 
      Roles: 
        - !Ref EBEC2Role

那么:

        - Namespace: 'aws:autoscaling:launchconfiguration'
          OptionName: 'IamInstanceProfile'
          Value: !Ref EBInstanceProfile