この質問は これ からスピンアウトしました。ここで何がうまくいかなかったのかをよりよく理解し、 不完全な場合でも実行可能な解決策 、より焦点を絞ったフォローアップを提出しています(私はまだ初心者のようなものですStackOverflow-これがエチケットに違反するかどうかをお知らせください。オリジナルをフォローアップする必要があります)。
このページ は、「AWS CodeBuildを使用して、サーバーレスアプリケーションをビルド、ローカルテスト、およびパッケージ化する」ことを示しています。ただし、sam build
にbuildspec.yml
コマンドを含めると、次のログ出力が表示され、sam
がCodeBuildイメージにインストールされていないことがわかります。
[Container] 2018/12/31 11:41:49 Running command sam build --use-container
sh: 1: sam: not found
[Container] 2018/12/31 11:41:49 Command did not exit successfully sam build --use-container exit status 127
[Container] 2018/12/31 11:41:49 Phase complete: BUILD Success: false
[Container] 2018/12/31 11:41:49 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: sam build --use-container. Reason: exit status 127
さらに、pip install aws-sam-cli
を指定してSAMをインストールすると、CodeBuildでsam build --use-container
を実行すると エラー になります。 sam build
自体は成功しますが、テストの依存関係がインストールされないため、CodeBuildでテストを実行できるようにするにはpip install -r tests/requirements-test.txt -t .
を使用する必要があります。さらに、 this は、「プログラムをネイティブにコンパイルしたパッケージ」には--use-container
が必要であることを示しています。
これは私が何か間違ったことをしようとしているのかどうか疑問に思います。 AWSのCI/CDワークフローでSAMサービスを構築するための推奨される方法は何ですか?
CodeBuildでsam build
コマンドを実行する場合は、最初にaws-sam-cliをインストールする必要があります(おそらくinstallフェーズbuildspec.ymlファイル)つまり、pip install aws-sam-cli
コマンドなどを実行します。
--use-container
コマンドのsam build
オプションにより、コマンドはAWS Lambda実行環境に似たDockerイメージをプルし、このDockerイメージからpip install
にコンテナーを実行します(ラムダがPythonで記述)ラムダデプロイメントパッケージを作成するための関数依存性。これにより、ラムダ関数がAWSLambdaの実際のランタイム環境と互換性のあるネイティブのコンパイル済みライブラリを使用するようになります。
したがって、CodeBuildで実行される--use-container
コマンドにsam build
オプションを指定する場合は、CodeBuildビルドプロジェクトで使用されるDockerイメージがDockerランタイムをサポートしていることも確認する必要があります。
最も簡単な方法は、aws/codebuild/standard:2.0
Dockerイメージという名前のCodeBuildビルド環境を使用することです。 Dockerランタイムの有効化buildspecのinstallフェーズのruntime-versions
プロパティで。 yml。また、ビルド環境からDockerデーモンに接続するには、CodeBuildプロジェクトの PrevilegedMode を有効にする必要がある場合があります。
2019年10月の時点で、sam build
を使用してcodebuild
でサーバーレスアプリケーションをデプロイすることに問題はありませんでした。
まず、--user
にはpip install aws-sam-cli
は必要ありません。実際、--user
を含めることが、sam
がパスにない唯一の理由のようです。
さらに、psycopg
のようにネイティブライブラリが構築されていない限り、--use-container
も必要ありません。