虎塚(144)29この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。こんにちは、虎塚です。Lambdaを使っていると、LambdaとLambdaをチェーンして使いたいことがあります。複数のアカウントで発生したイベントを1つのアカウントに集めるようなときには、Lambdaから別のAWSアカウントのLambdaを呼び出したいこともあります。Lambdaを呼びだす方法を説明します。本記事で設定手順を説明するAWS構成を次の図に示します。Streamを配置しました。Lambdaは、Lambda関数内の処理で、実行中のEC2インスタンスを停止します。それぞれのLambdaに必要な権限を次の図に示します。次の2点がポイントです。呼び出される側のLambdaのリソースポリシーで、アカウント000000000000による操作を許可します。クロスアカウント呼び出しの許可をリソースポリシーで与えるので、呼び出される側のLambdaの実行ロールで、アカウント000000000000を信頼ポリシーに含める必要はありません。以降にチュートリアルを用意しましたので、ピンとこない場合は、実際にお試しいただければと思います。設定手順Lambdaから別アカウントのLambdaを呼び出す構成を作成します。2つのAWSアカウント000000000000と、111111111111を利用できるものとします。LambdaなどのAWSリソースは、すべて東京リージョンに作成するものとします。コマンド実行時に、対象のアカウントを間違えないように注意してください。calleeをつけます。Streamを作成します。1作成されたことを確認します。my-streamストリームのARNは、ステップ2.4で使うので控えておきます。デプロイパッケージの作成ローカルで、次のPythonスクリプトをテキストファイルに保存します。特定し、パラメータとしてインスタンスIDを渡して呼び出す処理をします。デプロイパッケージを作成する環境として、EC2インスタンスを起動します。このインスタンスは、アカウント000000000000とアカウント111111111111のどちらで起動しても構いません。今回は、次のAMIを利用しました。ami-56d4ad31ec2-userのホームディレクトリに、Pythonスクリプトをローカルからコピーします。ec2-user@XXX.XXX.XXX.XXX:EC2インスタンスにSSHログインします。このAMIに初期インストールされているPythonは2.7.12で、pipが含まれているので、pipのインストールを省略できます。必要なパッケージをインストールします。gccパッケージ作成の作業環境を整えます。~/caller/bin/activateboto3はAWS上の実行環境で利用できるので、ローカルデバッグで利用したいときだけインストールします。関連ファイルを含めます。(コマンドを実行してしまっても問題ありません)。*デプロイパッケージにスクリプトを含めます。caller.pyEC2インスタンスからログアウトして、作成したデプロイパッケージをローカルにダウンロードしておきます。.このEC2インスタンスは、ステップ3.1でもう一度使うので、起動したままにしておきます。Lambdaの実行ロールの作成まず、IAMロールの信頼ポリシーを、ローカルにファイルで作成します。]}次に、上の信頼ポリシーを指定して、IAMロールを作成します。file://TrustPolicyForLambda.json戻り値に含まれるロールのARNは、ステップ2.3で使うので控えておきます。最後に、作成したIAMロールにアクセスポリシーを追加します。Lambdaの実行ログの出力を許可します。一般的なLambdaの実行ロールの権限です。Streamからデータの取得を許可します。Lambdaの呼び出しを許可します。calleeの呼び出しに必要です。デプロイパッケージのアップロードステップ2.1で作成したデプロイパッケージのzipファイルを指定して、Lambda関数を作成します。Lambdaのイベントソースに設定します。起動するようになります。デプロイパッケージの作成ローカルで次のPythonスクリプトをテキストファイルに保存します。)ステップ2.1で使ったインスタンスに上のスクリプトをコピーして、前回と同じ手順でデプロイパッケージを作成します。ec2-user@XXX.XXX.XXX.XXX:EC2インスタンスにSSHログインして、パッケージ作成の作業環境を整えます。関連ファイルを含めます。*デプロイパッケージにスクリプトを含めます。callee.pyEC2インスタンスからログアウトして、作成したデプロイパッケージをローカルにダウンロードしておきます。.このEC2インスタンスは、停止して削除してしまって構いません。Lambdaの実行ロールの作成アカウント111111111111でIAMロールを作成します。IAMロールの信頼ポリシーを、ローカルにファイルで作成します。]}ステップ2.2で作成した信頼ポリシーと同じように、Lambdaサービスロールとして必要な設定を定義します。次に、上の信頼ポリシーを指定して、IAMロールを作成します。file://TrustPolicyForLambdaAndCallerAccount.json戻り値に含まれるロールのARNは、ステップ3.3で使うので控えておきます。最後に、作成したIAMロールにアクセスポリシーを追加します。Lambdaの実行ログの出力を許可します。一般的なLambdaの実行ロールの権限です。EC2の操作を許可します。今回はEC2を停止させるために追加します。デプロイパッケージのアップロード前のステップで作成したデプロイパッケージのzipファイルを指定して、Lambda関数を作成します。権限の追加アカウント000000000000からこのLambda関数を呼び出せるように、Lambdaのリソースポリシーに権限を追加します。lambda:InvokeFunctionこれで設定が完了しました。呼び出せることを確認します。アカウント111111111111の東京リージョンに起動します。i-12345678901234567が起動していることを確認します。投入するデータを、ローカルにファイルで作成します。処理対象のインスタンスIDが含まれています。Streamにデータを投入します。LogsでLambdaのログを確認します。アカウント000000000000の/aws/lambda/callerロググループアカウント111111111111の/aws/lambda/calleeロググループエラーが出力されていないことを確認します。インスタンスの確認EC2インスタンスが停止されたことを確認します。'.Reservations[].Instances[].State.Name'"stopped"おわりにLambdaからLambdaをクロスアカウントで呼び出すための設定方法を説明しました。アカウントをまたいで複数のLambdaを繋ぎたいときに、この記事がお役に立てば幸いです。実際にこういった構成で環境を作る場合は、Lambdaに与える権限を適切に絞りましょう。(たとえば、今回の設定例でいうと、calleeの実行ロールに与える権限は、EC2のフルアクセスよりも停止だけのほうが望ましいです)それでは、また。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。夏目祐樹147こんにちは、CX事業本部の夏目です。MacのタッチバーのタッチIDが非常に便利なのですが、Terminalでsudoを叩かないと行けないときに使えたらなぁと思ったので、情報を共有します。タイトルがすべてなのですが、社内で「登壇勉強会」が開催されたので、「登壇は最強の生存戦略である」というタイトルで登壇しました。本が出ていたので読んでみたところよかったので紹介させていただきます。臼田佳祐295ワークフロー自動化OSSのn8nをAWS環境で建てて検証してみました。非常に期待できるサービスです。Fargateの勉強をしています。使ってみたい方は参考にしてください。洋介255SnowflakeがAWSの東京リージョン上で稼働するようになりました。データを日本に置けます。芳賀健233こんにちは!猫様の忠実なるしもべ、芳賀健です。Tokyoで開催されました。カフェ店長のオカノです。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。