AWS Cloud9から作成した関数をデプロイしようとしたらハマった話

はじめに

三菱総研DCS アプリケーションエンジニアの森です。
普段はフロントエンドからサーバサイド、ミドルウェア周辺まで様々な領域で開発業務を担当しています。

今回はある案件でAWS Cloud9から作成した関数をデプロイしようとしたら苦労した話を紹介します。

起こったことと解決策

起こったこと

  • Cloud9からLambda関数をデプロイしようとしたら、権限エラーでデプロイできない
  • 適切な権限を付与しても解決されない

解決策

  • CloudFormationの該当スタックを削除する
  • スタックの削除後適切な権限のユーザで再デプロイする

問題の発生~試したこと~解決

今回私が参画した案件では、

  • 環境構築が不要
  • Lambdaのローカル環境構築も不要
  • 新入社員とペアプログラミングもできる
  • なによりもすぐに開発を始めることができる

などの利点からAWS Cloud9を採用し開発を始めることになりました。
その矢先、今回の問題が発生してしまったのです…。

問題の発生

実際にどのような経緯で事が起こったのか、当時の流れはこうでした。

  1. 新規に開発者ユーザ(権限は「PowerUserAccess」)を作成
  2. 開発者ユーザでCloud9を作成
  3. Cloud9でLambda関数を作成
  4. 試しにLambdaにデプロイ

失敗!

確かに作成したユーザ権限(PowerUserAccess)には、「CreateRoleUser」権限がありません。

エラー内容の通り「CreateRoleUser」権限を付与します。
今回は解決を優先させるため一時的に「AdministratorAccess」をアタッチします。
通常は必要な範囲の権限のみアタッチするようにしてください。

権限を付与したので、再度デプロイしてみます。

しかしデプロイできず…。

試したこと

エラーの通り権限を付与してもデプロイできないので、いろいろ試してみました。

  • 再度エラーメッセージの通り足りない権限を付与する
    → やはりデプロイできない。
  • 情報収集
    → ネットで検索しても「適切な権限を与える」と出てくるが、それ以上の情報はない。
  • デプロイできないLambda関数をCodeCommitにpush、権限のある別ユーザのCloud9でgit pull後、同関数をデプロイ
    → なぜか開発者ユーザの権限が足りないと言われデプロイできない。

解決

いろいろ試したところ、どうやら必要な権限を付与するだけではダメだということが分かりました。

Cloud9からLambdaにデプロイする際、内部の動きとしてCloudFormationが動いています。
AWSのドキュメントには明記されていませんでしたが、初回デプロイ時に必要な権限などが足りず処理が失敗するとその後必要な権限を与えてもうまく処理できないようです。

そこで、CloudFormationの該当スタックを削除し、再実行することで問題なくデプロイすることができました。

また、試しに「権限あり→なし→あり」と「権限なし→あり」と実施したところ、以下のようになりました。

  • 権限あり→なし→あり
設定順序 1 2 3
admin権限 あり なし あり
デプロイ可否 OK NG OK
  • 権限なし→あり
設定順序 1 2
admin権限 なし あり
デプロイ可否 NG NG

「権限あり→なし→あり」は該当スタックを削除せずとも正しくデプロイできましたが、「権限なし→あり」はデプロイすることはできませんでした。

まとめ

Cloud9はボタン1つで自動的にLambdaへデプロイしてくれるので、ユーザとして簡単に利用できるのがメリットです。
一方、AWSのエラーメッセージは分かりづらいものも多く、「エラーメッセージの内容=解決法」とならないことも少なくありません。 AWSに限らず自動化である程度処理を任せられるのはいいことですが問題が起きた時、中身をよく知らないと対応できないと改めて感じました。
エンジニアとして、普段使ってるサービスやツールがどのように動いているのか理解しながら、今後も利用していきたいと思います。

用語解説(付録)

今回出てきたAWSのサービスについて、簡単にですが説明します。

AWS Cloud9

Cloud9とは、クラウドベースの統合開発環境(IDE)です。ネットワーク環境とブラウザさえあれば余計な環境構築など不要ですぐに開発を始めることができます。 JavaScript、Python、PHPなど多くの開発言語をサポートし、チーム内で環境を共有できるのでペアプログラミング等も行うことができます。
Cloud9は後述のLambdaのローカル環境も提供し、Cloud9上からLambdaに直接デプロイすることも可能です。
(参照元:AWS Cloud9

Lambda

LambdaはAWSが提供するサーバーレスコンピューティングサービスです。サーバの管理等はAWSで行ってもらえるので、開発者はコードのみ用意しデプロイするだけでコードを実行することができます。料金もコードの実行時間で課金される仕組みのため、ランニング費用も抑えることができます。
(参照元:AWS Lambda

CloudFormation

CloudFormationは、AWSリソースをあらかじめ定義した構成で作成してくれるサービスです。これを用いることで、開発者全員に同様の環境を容易に提供することも可能になります。
先述のCloud9の環境構築も裏側ではCloudFormationが動き、環境を構築する仕組みになっています。
(参照元:AWS CloudFormation