首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EC2安装-执行一个UserData脚本还是克隆一个存储库?

EC2安装-执行一个UserData脚本还是克隆一个存储库?
EN

Stack Overflow用户
提问于 2020-06-29 16:53:07
回答 1查看 997关注 0票数 1

我们最近为物联网数据构建并部署了一个摄取管道,并将我们的体系结构围绕着aws。现在,我们已经达到了规模,其中一些lambdas开始超时,我希望使用临时EC2实例来处理这些运行时间较长的任务。

我有一个lambda设置,它调用一个ec2实例并运行一个UserData脚本。以下是有关守则:

代码语言:javascript
复制
import { EC2 } from 'aws-sdk'

const region = 'eu-central-1'
const ImageId = 'ami-0a02ee601d742e89f'
const InstanceType = 't2.micro'
const ec2 = new EC2({ apiVersion: '2016-11-15', region })

const ec2Scheduler = async () => {
  const initScript = `#!/bin/bash
                    shutdown -h +5`
  const UserData = new Buffer(initScript).toString('base64')
  console.log(`Running EC2 instance with script: ${UserData}`)

  const instance = await ec2
    .runInstances({
      ImageId,
      InstanceType,
      UserData,
      MinCount: 1,
      MaxCount: 1,
      InstanceInitiatedShutdownBehavior: 'terminate',
    })
    .promise()
  const instanceId = instance?.Instances?.[0]?.InstanceId
  console.log(
    `Ec2 instance with id ${instanceId} created. will auto shutdown in 5 minutes`
  )
}

一切都很好很好。不过,我一直在讨论如何将我的javascript可执行文件传输到临时的EC2实例。

这里怎么走?我目前正在考虑这两种方法之一: a.将bitbucket凭据存储在秘密管理器中。然后使用我的userdata脚本安装节点/git,并从其中克隆存储库。更新我的部署管道,将javascript可执行文件存储在s3中,然后使用userdata脚本中的aws来获取可执行文件并运行它。

这两种选择似乎都有点笨拙。有没有一种更直接/直截了当/懒惰的方法?

EDIT=====================

我认为我需要调整我的心智模式,但对我来说还不太清楚。我的问题不是如何从s3中获取ec2实例中的代码,而是如何使用cloudformation来指定在s3中可用的可执行文件。从使用cloudformation/lambdas开始,我习惯于这样写:

代码语言:javascript
复制
  Scheduler:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs12.x
      CodeUri: ../dist/task-scheduler

作为包命令的结果,CodeUri中引用的代码随后被捆绑并上传到s3部署桶中,并将其提供给lambda。我想这里也有类似的解决方案。我可以提供一个codeUri的资源类型,然后我的ec2实例可以从s3获取该资源类型并执行。

到目前为止,感谢您的深刻评论!

EN

回答 1

Stack Overflow用户

发布于 2020-06-29 23:11:00

一个常见的做法是从S3桶中下载脚本。UserData被限制在16 so之内,所以您无论如何都需要下载和执行任何大型脚本(除非您使用那里的文件烘烤AMI )。

它将更容易保持它在AWS所有的PROD和你想要PROD是容易!

对于dev机器,我复制repo(在复制ssh键之后)并以这种方式设置它们。对于生产机器,它使用UserData和S3 (或Artifactory)形成所有云,存储在SSM参数存储中的任何凭据,以及通过分配给具有特定访问S3桶的EC2的IAM角色锁定的所有权限。

关键是在进行PROD之前有一些控制,我们不克隆回购的直接到PROD机器,有一个构建、测试和部署阶段。如果你愿意的话,从分公司克隆出来!

对不起,我没有Javascript/NodeJS中的版本,下面是一个x平台PowerShell示例,您可以使用或者至少按照我使用的步骤来配置:

DEV:

代码语言:javascript
复制
$region = 'us-west-1'
Write-Host 'Install NuGet, Git, SSH Keys directory and set region'
choco install git -y
$newPath = "$($env:PATH)C:\Program Files\Git\cmd;"
[Environment]::SetEnvironmentVariable( 'PATH', $newPath, "Machine")
$env:PATH = $newPath
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
install-module posh-git -force
import-module awspowershell
New-Item -ItemType Directory -Force -Path 'C:\Users\Administrator\.ssh' | out-null
$destinDir = "C:\Users\$($env:username)\.ssh"
$prefix = "tempcreds/$user/"
set-defaultawsregion -region $region
if ($user) {
  Write-Host 'Download GitHub Keys: Copy-S3Object -bucketname ' + $bucket + ' -key ' + $($prefix) + 'YOURKEYNAME -localfile ' + $destinDir + '\YOURKEYNAME'
  Copy-S3Object -bucketname $bucket -key "$($prefix)YOURKEYNAME" -localfile $destinDir\YOURKEYNAME -region $region
  Copy-S3Object -bucketname $bucket -key "$($prefix)YOURKEYNAME.pub" -localfile $destinDir\YOURKEYNAME.pub -region $region

  Write-Host 'Remove GitHub Keys: -key ' + $($prefix) + 'YOURKEYNAME'
  Remove-S3Object -bucketname $bucket -key "$($prefix)YOURKEYNAME" -force -region $region
  Remove-S3Object -bucketname $bucket -key "$($prefix)YOURKEYNAME.pub" -force -region $region

  Write-Host 'Save the GitHub Known_Hosts file'
  add-content -path "$destinDir\known_hosts" `
    -value $githubKnownHosts
  git config --global user.email $email
  git config --global user.name  $user
}

Write-Host 'cd to dev directory'
$devDir = 'C:\DEV'
new-item -itemtype directory -force -path $devDir | out-null
cd $devDir
Write-Host 'Execute git clone <git.com/YOUREPO>'
git clone <git.com/YOUREPO>.git

PROD:

代码语言:javascript
复制
#using the AWS API with S3 fetch the powershell install script and execute it
$S3BucketName = "unique-bootstrap-bucketname"
$bootstrap = "install-YOURREPO.ps1"
$script = ($path + $bootstrap)
Set-DefaultAWSRegion -Region $region
Copy-S3Object -BucketName $S3BucketName -key $bootstrap -LocalFile ($path + $bootstrap)
& $script -S3Name $S3BucketName
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62643013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档