前提・実現したいこと
lambda関数でboto3を利用しEC2インスタンス起動時に「dynamoDBにアクセスするpythonスクリプト」を実行したい
AWS lambdaにて指定のEC2インスタンスを起動(lambda関数4行目の処理)したときに
EC2インスタンスの /etc/init.d に設定しているshellからpythonスクリプトを実行する処理を組み込もうとしています。
pythonスクリプトをEC2起動時に実行することは成功しているのですが、pythonの中で dynamoDBにアクセスする処理が
あるとそこでエラーとなっていて後続処理が行われず困っています。
発生している問題・エラーメッセージ
〇実現できていること
cloud9でEC2を起動し、ターミナルで「/etc/init.d/app_start start」(shell起動コマンド)を実行すると、
dynamoDBへのアクセス処理があっても問題なく後続処理まで実行される
×lambda関数でboto3を利用してEC2を起動した場合、同様にshellが起動しpythonスクリプトが実行されるが、
この場合はなぜかdynamoDBアクセスの処理でエラーとなって止まっている
(エラーメッセージ「An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials」)
該当のソースコード
■lambda関数
python
1import boto3 2region = 'ap-northeast-1' 3ec2 = boto3.client('ec2', region_name=region) 4ec2.start_instances(InstanceIds=[instance]) # instanceに所定のinstanceid を設定
以下、EC2内の設定ファイル
■起動shell (/etc/init.d/app_start)
shell
1#!/bin/bash 2# 3# chkconfig: 2345 99 10 4# description: app_start shell 5case "$1" in 6 start) 7 su -l ec2-user -c "sh /home/ec2-user/environment/start_app.sh" 8 ;; 9 stop) 10 /usr/bin/pkill python 11 ;; 12 *) break ;; 13esac
■実行shell (/home/ec2-user/environment/start_app.sh)
shell
1# cat /home/ec2-user/environment/start_app.sh 2#!/bin/bash 3 4/usr/bin/python /home/ec2-user/environment/test.py 5 6exit 0
■自動起動したいpythonスクリプト(/home/ec2-user/environment/test.py)
python
1import boto3 2dynamoDB = boto3.resource('dynamodb') 3table = dynamoDB.Table('table') 4ec2 = boto3.resource('ec2') 5instance = ec2.Instance(id=instance_id) # instance_id は自分自身のインスタンスID 6userid = 'XXXXXXXX' 7data = table.get_item( 8 Key={ 9 'user': userid 10 } 11 ) 12print(data)
試したこと
・起動shell内で ec2-user で実行するようにしないとうまく動かなかったので su -l ec2-user -c している。
・以下の通り様々なポリシーをロールに設定しlambda、EC2に割り当ててみたが、うまく動かない。
lambda関数、該当のEC2インスタンスにはそれぞれ以下のポリシーを付与したIAMロールを設定している
■lambda関数
・AmazonEC2FullAccess
・AmazonDynamoDBFullAccess
・CloudWatchLogsFullAccess
・AmazonSSMFullAccess
■EC2インスタンス
・AmazonEC2FullAccess
・AmazonEC2RoleforSSM
・AmazonDynamoDBFullAccess
・AdministratorAccess
・AmazonSSMManagedInstanceCore
・CloudWatchLogsFullAccess
・AmazonSSMFullAccess
補足情報(FW/ツールのバージョンなど)
・AWS Amazon linux
lambda関数からboto3を使った場合の権限とcloud9でEC2内で直接shell実行したときとで
実行権限が何か違ってエラーとなっているのではないかと思っていますが、次の一手がなく困っています。
何か解決策になりそうなものがございましたら、ご教示頂けると幸いです。
回答1件
あなたの回答
tips
プレビュー