我们最近为物联网数据构建并部署了一个摄取管道,并将我们的体系结构围绕着aws。现在,我们已经达到了规模,其中一些lambdas开始超时,我希望使用临时EC2实例来处理这些运行时间较长的任务。
我有一个lambda设置,它调用一个ec2实例并运行一个UserData脚本。以下是有关守则:
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开始,我习惯于这样写:
Scheduler:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs12.x
CodeUri: ../dist/task-scheduler作为包命令的结果,CodeUri中引用的代码随后被捆绑并上传到s3部署桶中,并将其提供给lambda。我想这里也有类似的解决方案。我可以提供一个codeUri的资源类型,然后我的ec2实例可以从s3获取该资源类型并执行。
到目前为止,感谢您的深刻评论!
发布于 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:
$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>.gitPROD:
#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 $S3BucketNamehttps://stackoverflow.com/questions/62643013
复制相似问题