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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

解決済

1回答

2639閲覧

EC2起動時に自動実行されるpythonスクリプト内でdynamoDBにアクセスできない

212Yuichi

総合スコア15

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

1クリップ

投稿2020/11/17 03:16

編集2020/11/17 09:18

前提・実現したいこと

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実行したときとで
実行権限が何か違ってエラーとなっているのではないかと思っていますが、次の一手がなく困っています。
何か解決策になりそうなものがございましたら、ご教示頂けると幸いです。

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

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

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

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

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

take88

2020/11/17 05:50

どううまくいかないのかが質問文だと分かりにくく回答しづらいと思いました。エラーメッセージなどが出力されてないかが気になります。
212Yuichi

2020/11/17 08:50 編集

もう少し状況を整理し内容を修正してみました。ちなみに、エラーを拾ってみたところ、「An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials」でした。
guest

回答1

0

自己解決

自己解決したので、共有します。エラーメッセージがわかってからは比較的スムーズに解決しました・・・

こちらのリンク↓
https://qiita.com/tsukamoto/items/00ec8ef7e9a4ce4fb0e9

にありますように、boto3の認証情報の優先順位があり、結論からいうと

1.boto.client() メソッドにパラメーターで渡された資格情報

の手順にある通りaws_access_key_id、aws_secret_access_keyを指定してboto3を利用することで
解決しました。

take88さんのエラーメッセージは?の文言でエラー吐けばいいことを思い出し(笑)、
エラーメッセージがわかってからはすぐに解決までたどり着くことができました。
ご回答いただきありがとうございました。

投稿2020/11/17 13:32

212Yuichi

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問