簡體   English   中英

使用PHP與私有Composer存儲庫的AWS Elastic Beanstalk

[英]AWS Elastic Beanstalk using PHP with Private Composer Repositories

在PHP環境中使用Amazon AWS Elastic Beanstalk進行部署時,如何使用私有編寫器存儲庫? 特別使用GitHub(Q&A風格,回答如下)

我們需要為我們通過AWS的Elastic Beanstalk(EB)部署的PHP項目使用私有庫。 這個私有庫托管在GitHub上,雖然類似的git托管(您自己的服務器,BitBucket等)可能具有類似的身份驗證,並且可以使用此解決方案進行部署。

我們使用SSH憑據來獲取私有git存儲庫。 由於我們使用的是GitHub,我們使用了GitHub的Deploy Keyshttps://help.github.com/articles/managing-deploy-keys#deploy-keys )這些鍵允許對特定存儲庫進行只讀訪問,這對我們來說是完美的。需要。 根據您的需求評估最佳解決方案,GitHub針對每種方法列出了很多優缺點。

我們選擇的解決方案將部署密鑰嵌入到存儲庫中。 這有點安全漏洞。 我們正在處理所有私有回購,具有(理想情況下)安全服務器,但這仍然存在一定的安全風險。

所有這一切最終都與使用Elastic Beanstalk部署PHP堆棧的方式有點麻煩,composer.json過早地自動運行並且密鑰未事先就位。 我們找到了解決方法。

這假設您已經進行了部署設置,但只是部署了密鑰。 我們使用AWS提供的eb cli工具(eb init,eb branch,eb start等)來完成工作,以及git hooks,git aws.push進行部署。

一旦我們有了Deploy Keys,我們就可以使用SSH地址將我們的庫添加到composer.json文件中:

{
...
"require": {
        "repository/project": ">=1.0.0"
},
...
"repositories": [
    {
        "type": "git",
        "url":  "git@github.com:repository/project.git"
    }
]
}

配置你的.gitignore,以便在你的存儲庫和沒有它內容的vendor文件夾中提交composer.lock文件:

[remove composer.lock from file if it exists]
vendor/*

我們更喜歡將composer.lock文件保存在存儲庫中,因為它鎖定了測試中使用的版本。 當我們遷移到生產環境時,我們確保應用程序運行時使用我們測試的相同庫。 必須使用vendor文件夾來欺騙EB,而不是自動運行composer.phar安裝過程。 我們需要它等到我們有ssh密鑰到位。

設置密鑰:我找不到聯系密鑰的好方法,並通過腳本接受github.com作為known_host。 我最終通過半部署的軟件SSH連接到EB托管服務器,將id_rsa和id_rsa.pub密鑰文件添加到~root / .ssh /(記住400 perms!)然后嘗試ssh -T git@github.com (如github推薦)這將提示接受主機並在~root / .ssh / known_hosts文件中添加一個條目。 將此文件的內容復制到您正在處理項目的位置。

我們正在.ebextensions /文件夾中創建所有設置腳本,以配置Linux服務器以進行部署。 在部署前階段之后,從服務器中刪除此文件夾(據我所知)。 我們正在使用PHP 5.5 64位Amazon AMI解決方案。 將id_rsa和id_rsa.pub鍵移動到新的.ebextensions文件夾中。 還要將名為known_hosts的文件添加到具有我們之前提供的known_hosts內容的文件夾中。 現在我們需要3個文件,我們需要創建一個最終部署指令文件 :01-github-deploy-keys.config(根據需要命名文件)

container_commands:
    11-move-priv-key:
        command: "mv ~root/.ssh/id_rsa ~root/.ssh/id_rsa.bak; cp .ebextensions/id_rsa ~root/.ssh/id_rsa; chmod 400 ~root/.ssh/id_rsa;"
    12-move-pub-key:
        command: "mv ~root/.ssh/id_rsa.pub ~root/.ssh/id_rsa.pub.bak; cp .ebextensions/id_rsa.pub ~root/.ssh/id_rsa.pub; chmod 400 ~root/.ssh/id_rsa.pub;"
    12-known-hosts:
        command: "mv ~root/.ssh/known_hosts ~root/.ssh/known_hosts.bak; cp .ebextensions/known_hosts ~root/.ssh/known_hosts; chmod 644 ~root/.ssh/known_hosts;"
    20-install-composer:
        command: "./composer.phar install;"

記住YAML文件使用4個空格,而不是標簽! 有關這些container_commands如何工作的信息,請參閱AWS文檔: http//docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-commands它們將在文件運行后運行從存儲庫中取出。 “container_commands”部分中的這些命令具有項目的工作目錄,因此首選本地路徑。

添加所有這些文件需要添加並提交到存儲庫。 運行你的git aws.push進行部署。

為了正確測試設置,您需要從EB解決方案堆棧中刪除服務器並重新添加它。 我只是進入EC2控制面板,找到該項目的托管服務器並終止它。 EB會自動為您創建一個新的,並在准備好后附加它。 仔細檢查您的日志,特別是/var/log/cfn-init.log部分。 此時最好通過安全組關閉對服務器的SSH訪問。 我認為EB通過SSH限制登錄到root,但只是為了確保您可能希望通過防火牆/安全組一起禁用SSH訪問。 您不應該將ssh分成單獨的框進行配置,因為它們應該被視為易失性。

這是2014-02-20的問答,請發表任何評論或修正。

謝謝, - 賽斯

TLDR:在composer.json上使用〜/ .composer / auth.json,github-oauth,或創建如下所示的自定義腳本:


這是我的02-github-deploy-keys.config文件。 它現在正在運作。 唯一的解決方法是禁用StrictHostKeyChecking。 但是,如果您願意,可以在此腳本運行后打開StrictHostKeyChecking。

我將/ vendor(沒有任何文件)添加到Git,以便在密鑰正常之前阻止AWS自動運行Composer。 為此,我在/ vendor中創建了一個.gitignore文件,其中包含:

*
!.gitignore

我將密鑰(id_rsa)存儲在S3存儲桶中,我允許“授權”人員讀取該文件,但您可以將該文件放在您的github存儲庫中。 這些密鑰是在計算機用戶上生成的( https://developer.github.com/guides/managing-deploy-keys/#machine-users )。

files:
    "/home/ec2-user/sshgit/composer.sh":
        mode: "00755"
        owner: ec2-user
        group: ec2-user
        encoding: plain
        content: |
            if [ ! -f /home/ec2-user/id_rsa ] ; then
              aws s3 cp s3://eb-files/id_rsa /home/ec2-user/id_rsa
              chmod 0400 /home/ec2-user/id_rsa
            fi

            eval `ssh-agent -s`
            ssh-add /home/ec2-user/id_rsa

            echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config

            export COMPOSER_HOME=/root
            COMPOSER_HOME=/root
            /opt/elasticbeanstalk/support/composer.phar install --no-interaction

container_commands:
    01-run-composer:
        command: "/home/ec2-user/sshgit/composer.sh"

只是想指出通過將其添加到composer.json有一種更簡單(可能更冒險)的方法:

"config": {
   "github-oauth": {
        "github.com": "YOUR-OAUTH-KEY"
    }
}

還有第三種方法,我沒有測試,但你可以創建一個〜/ .composer / auth.json,作曲家可能會理解你的令牌。

我為此苦苦掙扎。 我在AWS CodeCommit中得到了回購,並且正在尋找解決它的阻力最小的路徑。 我試過了〜/ .composer / auth.json,但看起來在我可以將文件放到原位等之前運行了composer等。

我去了一個方法,其中包括我的repo中的供應商目錄(擺脫.git文件夾,以便它不會將它們作為子模塊處理),然后整個事物通過包含該文件夾的zip文件發布到Elastic Beanstalk。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM