amazon-web-services - Cloudformation EC2 在每次更新后运行命令行

我试图让我的 cloudformation 文件在部署 EC2 实例后触发一些命令。

AWSTemplateFormatVersion: 2010-09-09
Description: Reports

Parameters:
  AmiID:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Description: "The ID of the AMI."
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources:
  WebAppInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref AmiID
      InstanceType: t2.micro
      SecurityGroupIds:
        - !Ref WebAppSecurityGroup
      UserData:
        'Fn::Base64': |-
          #!/usr/bin/env bash
          curl -O https://bootstrap.pypa.io/get-pip.py
          python3 get-pip.py --user
          pip install Flask
          aws s3 sync s3://project-pi-reports-codepipeline-bucket/ /home/ec2-user/project-pi-reports
          set FLASK_APP=hello 
          flask run /home/ec2-user/project-pi-reports

      IamInstanceProfile:
        Ref: ListS3BucketsInstanceProfile

  ListS3BucketsInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
        - Ref: ListS3BucketsRole

  ListS3BucketsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"

  ListS3BucketsPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: ListS3BucketsPolicy
      PolicyDocument:
        Statement:
          - Effect: Allow
            Action:
              - s3:*
            Resource: "*"
      Roles:
        - Ref: ListS3BucketsRole

  WebAppSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Join ["-", [webapp-security-group, dev]]
      GroupDescription: "Allow HTTP/HTTPS and SSH inbound and outbound traffic"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 5000
          ToPort: 5000
          CidrIp: 0.0.0.0/0

  WebAppEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
      InstanceId: !Ref WebAppInstance
      Tags:
        - Key: Name
          Value: !Join ["-", [webapp-eip, dev]]

Outputs:
  WebsiteURL:
    Value: !Sub http://${WebAppEIP}
    Description: WebApp URL

我基本上想要的是,一旦通过 CodePipeline 更新 EC2 实例,从 s3 下载最新文件,然后启动烧瓶服务器。

我已将这些行添加到我的 cloudformation 文件中,在 UserData 下,但它仅在第一次创建实例时运行,而不是在触发堆栈更新时运行。

有什么办法,我可以让这些命令在每次更新时运行?

回答1

它只在第一次创建实例时运行,而不是在触发堆栈更新时运行。

是的。这就是 UserData 的工作原理。但是,如果您可以在 pipeline 中的每次更新后重新启动实例,则可以按照 https://aws.amazon.com/premiumsupport/knowledge-center/execute-user-data-ec2/ 中的说明让 UserData 在每次重新启动时运行。

有什么办法,我可以让这些命令在每次更新时运行?

是的。这通常由 https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html 完成,这将是您的 CI/CD pipeline 的一部分。或者,在您的 pipeline 中,您可以使用 https://docs.aws.amazon.com/systems-manager/latest/userguide/execute-remote-commands.html 在您的实例上运行任意代码。当然,这也需要添加到您的 pipeline 中。

相似文章

随机推荐

最新文章