質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2825閲覧

laravel Lambda レイヤーの内容をコンテナイメージにコピーするには?

akasatanaha

総合スコア44

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/09/30 09:18

編集2021/10/20 05:26

laravel をコンテナイメージにして、Lambda を使っております。

以下URLを参考にして bref,serverless,laravel,php,lambda で環境を構築しました。
LaravelをコンテナにしてLambdaでデプロイするのが超簡単になった2021年

そこで php の拡張機能(gd)を追加したいと思い色々試したのですが、
コンテナイメージは、Lambda レイヤーをサポートしていないので
コンテナイメージ自体に Lambda レイヤーをコピーする必要があることが分かりました。

以下参照
コンテナイメージ内でLambda レイヤーと拡張機能を動作させる

コンテナイメージとしてパッケージ化された Lambda 関数は関数設定へのLambda レイヤーの追加をサポートしていません。 ただし、コンテナイメージで Lambda レイヤーの機能を使用するソリューションはあります。 あなた自身がビルドプロセス中に、好みのランタイムと依存関係をコンテナイメージの一部としてパッケージ化する作業を行います。

Lambda レイヤー追加方法とは?

  • (上記URLから)『Lambda レイヤーの内容をコンテナイメージにコピーする』必要がある。

この作業がいまいちどうすれば良いか分からないので、大変申し訳ございませんが、どういう手順で進めればよいか
ご教示願えますでしょうか。

試したこと編集前の Dockerfile

FROM bref/php-80-fpm COPY . /var/task CMD [ "public/index.php" ]

Dockerfile で追加したい Lamdba レイヤーを取り込めばいいのかな?と思い、上記あったサイトのように記述してみる。
が、apt-getコマンドが見つからないと言われる。そもそもこの方法であっているのか!?

編集後 Dockerfile

FROM bref/php-80-fpm COPY . /var/task RUN yum -y install aws-cli curl unzip RUN mkdir -p /opt RUN curl $(AWS_DEFAULT_REGION=ap-northeast-1 AWS_ACCESS_KEY_ID=xxxxxx AWS_SECRET_ACCESS_KEY=xxxxxx aws lambda get-layer-version-by-arn --arn arn:aws:lambda:hogehgoe:php-gd:1 --query 'Content.Location' --output text) --output layer.zip RUN unzip layer.zip -d /opt RUN rm layer.zip CMD [ "public/index.php" ]

実行後

# sls deploy --stage dev Serverless: Configuration warning at 'disabledDeprecations[0]': should match pattern "^[A-Z0-9_]+$" Serverless: Serverless: Learn more about configuration validation here: http://slss.io/configuration-validation Serverless: Serverless: Packaging service... Serverless: Excluding development dependencies... Sending build context to Docker daemon 290.4MB Step 1/8 : FROM bref/php-80-fpm ---> 540bd4e4f016 Step 2/8 : COPY . /var/task ---> 163363282de0 Step 3/8 : RUN yum -y install aws-cli curl unzip ~~省略 Step 4/8 : RUN mkdir -p /opt ---> Running in c603553f2e55 Removing intermediate container c603553f2e55 ---> c35462e37fd8 Step 5/8 : RUN curl $(AWS_DEFAULT_REGION=ap-northeast-1 AWS_ACCESS_KEY_ID=AKIA3DMDSKW5JOBBUJUV AWS_SECRET_ACCESS_KEY=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 aws lambda get-layer-version-by-arn --arn arn:aws:lambda:ap-northeast-1:763169494458:layer:php-gd:4 --query 'Content.Location' --output text) --output layer.zip ---> Running in b13050df8a81 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 686k 100 686k 0 0 1511k 0 --:--:-- --:--:-- --:--:-- 1508k Removing intermediate container b13050df8a81 ---> 2060c52ff462 Step 6/8 : RUN unzip layer.zip -d /opt ---> Running in 826814675f5d Archive: layer.zip inflating: /opt/bref/lib/php/extensions/no-debug-non-zts-20200930/gd.so creating: /opt/bref/lib/x86_64-linux-gnu/ inflating: /opt/bref/lib/x86_64-linux-gnu/libgdbm_compat.so.4.0.0 inflating: /opt/bref/lib/x86_64-linux-gnu/libgdbm.so.6.0.0 inflating: /opt/bref/lib/x86_64-linux-gnu/libgd.so.3.0.8 inflating: /opt/bref/lib/x86_64-linux-gnu/libgdbm_compat.so.4 inflating: /opt/bref/lib/x86_64-linux-gnu/libgd.so.3 inflating: /opt/bref/lib/x86_64-linux-gnu/libgdbm.so.6 inflating: /opt/bref/lib/php/extensions/no-debug-non-zts-20200930/libgdbm_compat.so.4.0.0 inflating: /opt/bref/lib/php/extensions/no-debug-non-zts-20200930/libgdbm.so.6.0.0 inflating: /opt/bref/lib/php/extensions/no-debug-non-zts-20200930/libgd.so.3.0.8 inflating: /opt/bref/lib/php/extensions/no-debug-non-zts-20200930/libgdbm_compat.so.4 inflating: /opt/bref/lib/php/extensions/no-debug-non-zts-20200930/libgd.so.3 inflating: /opt/bref/lib/php/extensions/no-debug-non-zts-20200930/libgdbm.so.6 Removing intermediate container 826814675f5d ---> 43589f96b25d Step 7/8 : RUN rm layer.zip ---> Running in 8cd540fdb6d9 Removing intermediate container 8cd540fdb6d9 ---> 94e4b766402a Step 8/8 : CMD [ "public/index.php" ] ---> Running in fbf556426956 Removing intermediate container fbf556426956 ---> 2f91c8be01c0 Successfully built 2f91c8be01c0

↑のログのStep6にてファイルが展開されていることが分かる。
また実際に該当ディレクトリにファイルがあるか確認したところ存在しました。
が、phpinfo()で確認したところ、gd は設定されていないとのこと。
なので、追加したレイヤー(gd レイヤー)が、正しいものではないようだ・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分もやったことがあるわけではないですが、
AWS環境変数が足りないとか細かいことを除けば、やらんとしてることは合っていると思います。

apt-getコマンドが見つからないと言われる。そもそもこの方法であっているのか!?

bref/php-80-fpmのイメージはAmazon Linuxをベースにしていて、
パッケージマネージャはaptではなくyumが使えますので、置き換えてみてはいかがでしょうか。

$ docker run -it --rm --entrypoint /bin/bash bref/php-80-fpm bash-4.2# cat /etc/os-release NAME="Amazon Linux" VERSION="2" ID="amzn" ID_LIKE="centos rhel fedora" VERSION_ID="2" PRETTY_NAME="Amazon Linux 2" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2" HOME_URL="https://amazonlinux.com/" VARIANT_ID="202108231240-2.0.499.0"

投稿2021/10/18 07:27

surface_0

総合スコア497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akasatanaha

2021/10/19 10:02 編集

ご教示誠にありがとうございます! あぁーAmazon Linuxがベースなんですね。ローカルが ubuntu なので、その環境でやるものだと思っておりました。(いまいち仕組みが分かってないですが・・・) とりあえず yum install に変えて実行してみましたが、エラーになりその後どうすればよいかよくわかりません。。。 実行内容については、質問を編集させていただきました。
surface_0

2021/10/19 10:26

Dockerのビルドはコンテナ内で行う作業なので、ホスト環境ではなくベースイメージの環境に依存します。 > Is this ok [y/d/N]: Exiting on user command yum install はバッチ処理する場合、 -y オプションを付けておかないと中断してしまいます。
akasatanaha

2021/10/19 18:47 編集

返信ありがとうございます! yum install -y と aws コマンドの環境変数をつけることで、デプロイ出来ました!! ただ phpinfo() の結果を見ると gd が反映されていない・・・ レイヤーの作り方がまずかったのかもしれないし、そもそも追加したレイヤーが読み込まれているのかどうかも分からない・・・。 詳細は、編集後 Dockerfileに記載させていただきました。
surface_0

2021/10/20 04:09

普通はレイヤーをただ単に展開しただけでは効力を得られないので、中身を然るべき場所に配置する必要があると思います。 ただレイヤーの中身がどうなってるとかはわからないですし、細かい指示はキリがなくなってしまうので控えますが、 PHPでGD拡張が使えるようにしたいのであればどうあるべきか、というのが分かっていれば自ずと答えは出ると思います。 もしこれが分かっていないのであれば、LamdaレイヤーというよりPHPの扱いについて学ぶべきと思います。 あと、今回はLamdaレイヤーを取り込むにはということが主題でしたが、 単にGDが使いたいだけで済むのならば、別の方法(例えばyumとか)でインストールする方が早いと思います。
akasatanaha

2021/10/20 09:57 編集

yum で gd をインストール!?すっごいいい案じゃない~と喜び勇んで試しましたが、上手く行きませんでした。 インストールは出来たし、php.iniに extension=gd.so も追加した。 gd.so も extension_dir 以下にコピーした。シンボリックリンクでも試した。 だがWEBサーバー(apache?)の再起動は出来ない(Lamdaだから再起動は必要ないのか!?)。 ゆえにLambdaでこの手は使えないのではないかと思ったのですが、どうでしょうか? それとも gd.so だけextension_dir にコピーしたが依存モジュールは何もしていないので それがイケないのでしょうか?
surface_0

2021/10/20 14:42 編集

ここで使っているPHPのイメージはFPMですのでWebサーバは関係してないです。 あとこのイメージはyumでインストールできるバージョンとは違うPHPが入っているので(というか作りが特殊なので)そのままyumしても駄目そうですね… それはさておき、brefについてあまりよく知っていなかったのですが、調べてみたら各種拡張についてはDockerイメージが用意されているようです。 https://github.com/brefphp/extra-php-extensions#docker-images もちろんGDもありました。 https://hub.docker.com/r/bref/extra-gd-php-80 レイヤー云々を主眼においていましたが、実際は以下の一文だけでGDは使えるようになると思います。 COPY --from=bref/extra-gd-php-80 /opt /opt 作ったイメージでコンテナを立ち上げて php -i | grep GD とかで確認すれば有効になったかわかると思います。 Lambdaレイヤーを組み込む事に注目してしまって、提示すべきbrefイメージでGDを使う方法を確認せずに、本末転倒になってしまっていた事をお詫びします。
akasatanaha

2021/10/20 13:12

ご教示ありがとうございます!! COPY --from=bref/extra-gd-php-80 /opt /opt で、gd インストール出来ました!! また本末転倒だなんて。自分が提示した方法が悪かったからで・・・。 この問題にずっと悩まされてきていたからご提示いただきましたいろいろな案は自分にとっても知らないことばっかりでしたのですごく勉強になりました!!!感謝感激です!!
akasatanaha

2021/10/20 13:18

ちなみに別件なのですが、https://teratail.com/questions/354758 の function webは、本件で解決したのですが、function artisan 側が image と違うので gd.so が見つからないとエラーが出るのですが、もし何か解決方法案などありましたらご教示いただければ嬉しいです。
surface_0

2021/10/20 15:26

解決してなによりです。 別件に関しては何か分かれば回答させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問