はじめに
https://qiita.com/bakachou/items/d8633df31b7cd9b4262c
ここで、Lambda を利用して AWS EC2 のインスタンスを管理する記事を書いている続き。
アクセスキーとシークレットキーを AWS Password Manager から取得して、Lambda で awscli を実行させるメモ。
手順
https://qiita.com/bakachou/items/d8633df31b7cd9b4262c
Lambda のレイヤーを作成するときに Ruby、Python の関数でも利用できるようにする。
- Amazon Secret Manaer で awscli のアクセスキー、シークレットキーを登録
- Lamdaレイヤーで互換性のランタイムで Ruby、python などプログラムが実行できるものを選択する
- レイヤーを関数に割り当てる
- [コード]で Secret Manager からデータを取得するプログラムを実行して awscli を動作
Amazon Secret Manaer で awscli のアクセスキー、シークレットキーを登録
AWS Secret Manager で [新しいシークレットを保存する] を選択
[キー/値のペア] でAWS のアクセスキー、シークレットキーを登録
[シークレットの名前] を入力して [次] をクリック
ローテーションは特に関係ないため、そのまま [次] をクリック
レビュー画面で確認を促されるので、確認後 [保存]する
レビュー画面で Secret Manager から情報を取得するサンプログラムが表示される。
これをあとで使うので、どこかコピーしておく。
(後でも表示できるので、コードを記載するときにでもよい)
Lamdaレイヤーで互換性のランタイムで Ruby、python などプログラムが実行できるものを選択する
互換性のあるランタイムで以下を選択する
- Pytho 3.13
- Ruby 3.3
- Amazon Linux 2023
レイヤーを Lambda 関数に割り当てる
python は知らないので ruby で作ります
関数を作り、レイヤーを割り当てます
[コード]で Secret Manager からデータを取得するプログラムを実行して awscli を動作
[コード] のタブで以下のように ruby のコードを記載します。
Secret Manager から取得するコードは AWS Sercret Manager の画面でサンプルコードが出てきますので、それを利用します。
下のサンプルでは EC2 のインスタンスID 一覧を表示しています。
require 'json'
require 'aws-sdk-secretsmanager'
command='/opt/bin/aws --version'
result = system (command)
p result
def get_secret()
client = Aws::SecretsManager::Client.new(region: 'ap-northeast-1')
begin
get_secret_value_response = client.get_secret_value(secret_id: 'AWSCLI_SECRET')
rescue StandardError => e
# For a list of exceptions thrown, see
# https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
raise e
end
secret = get_secret_value_response.secret_string
# Your code goes here.
return secret
end
def lambda_handler(event:, context:)
# TODO implement
{ statusCode: 200, body: JSON.generate('Hello from Lambda!') }
end
secret_string = get_secret()
hash_secret = JSON.parse(secret_string)
# p hash_secret['AWS_API_KEY']
# p hash_secret['AWS_SECRET_KEY']
command="/opt/bin/aws configure set hash_secret['AWS_API_KEY'] hash_secret['AWS_SECRET_KEY']"
result = system (command)
p result
command="aws ec2 describe-instances --query 'Reservations[].Instances[].{InstanceId:InstanceId}'"
result = system (command)
p result










