AWS Secrets Manager のシークレット用の AWS Lambda 関数を作成したいです。使用しているデータベースまたはサービスでは、自動ローテーション関数をサポートしていません。
解決策
前提条件 AWS コマンドラインインターフェイス (AWS CLI) をインストールし、設定してください。
注: AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI でのエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Lambda ローテーション関数用のコードを作成する
手順については、「データベース以外の AWS Secrets Manager シークレットに自動ローテーションを設定する」を参照してください。
汎用ローテーション関数のテンプレートに基づいて AWS CloudFormation 変更セットを作成する
- AWS CLI コマンド create-cloud-formation-change-set を実行します。
- **--stack-name ** を実際の CloudFormation スタック名に置き換えます。
- --parameter-overrides を AWS リージョンにおける Secrets Manager の リージョナルエンドポイント および、テンプレートが作成するローテーション関数の名前に置き換えます。
AWS CLI コマンド create-cloud-formation-change-set の例
aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate --stack-name MyLambdaCreationStack --parameter-overrides Name=endpoint,Value=https://secretsmanager.REGION.amazonaws.com Name=functionName,Value=MySecretsManagerRotationFunction --capabilities CAPABILITY_IAM CAPABILITY_RESOURCE_POLICY
注: arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate の ARN は、表示されたものをそのまま使用します。
CloudFormation 変更セットを使用してスタックを更新する
create-cloud-formation-change-set コマンドは、ApplicationId、ChangeSetId、SemanticVersion、StackId 値を返します。
次の手順を実行します。
- execute-change-set コマンドの実行時には、change-set-name を ChangeSetId 値に置き換えます。
- AWS CLI コマンド execute-change-set を実行します。
aws cloudformation execute-change-set --change-set-name arn:aws:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE
CloudFormation スタックにより、Lambda 関数と AWS Identity and Access Management (IAM) ロールが作成されます。IAM ロールには Lambda 関数に必要なアクセス許可が含まれます。
Lambda 関数の作成を検証する
AWS CLI コマンド list-functions を実行します。
aws lambda list-functions
Output
{
...
"FunctionName": "MySecretsManagerRotationFunction",
...
"FunctionArn": "arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction",
...
}
注: FunctionName の値は、--parameter-overrides オプションで指定した関数名と一致します。
Lambda 関数の Amazon 仮想プライベートクラウドへのアクセスを設定する
データベースまたはサービスが Amazon Virtual Private Cloud (Amazon VPC) 内ある場合は、update-function-configuration コマンドを実行し、Lambda ローテーション関数を Amazon VPC 内で実行するように設定します。VPC のサブネット ID とセキュリティグループ ID を必ず指定してください。詳細については、「Lambda 関数に Amazon VPC 内のリソースへのアクセスを許可する」を参照してください。
注: データベースまたはサービスを Amazon VPC 内に配置していない場合は、このステップをスキップしてください。
AWS CLI コマンド update-function-configuration の例:
$ aws lambda update-function-configuration --function-name your-lambda-function \
--vpc-config SubnetIds=subnet-076c28105d486f3bd,subnet-0af00c796ccdc725f,SecurityGroupIds=sg-0aed64f81acc4c037
Secrets Manager 用の Amazon VPC エンドポイントを作成する
データベースまたはサービスを含む Amazon VPC や Lambda ローテーション関数がインターネットにアクセスできない場合は、Amazon VPC エンドポイントを作成します。Amazon VPC でプライベートサービスエンドポイントを設定し、Secrets Manager にアクセスして VPC 内のエンドポイントでローテーション関数を有効にします。AWS CLI コマンド create-vpc-endpoint を実行します。
注: データベースまたはサービスを Amazon VPC 内に配置していない場合は、このステップをスキップしてください。
$ aws ec2 create-vpc-endpoint --vpc-id vpc-0abb11f5a28a8abe7 --vpc-endpoint-type Interface \
--service-name com.amazonaws.your-region.secretsmanager --subnet-ids subnet-076c28105d486f3bd subnet-0af00c796ccdc725f \
--security-group-ids sg-0bacf4bbed67e4df5
Lambda 関数とデータベースまたはサービス間のネットワーク接続を設定する
Lambda 関数が、必要なネットワークポートを経由でデータベースまたはサービスにルーティングできることを確認します。ポートとルーティングの要件は、データベースまたはサービスおよび、関連する VPC 設定によって異なります。
注: データベースまたはサービスを Amazon VPC 内に配置していない場合は、このステップをスキップしてください。
ユースケースに合わせてローテーション関数をカスタマイズする
ローテーションテンプレートには、createSecret と finishSecret ステップが実装されています。ユースケースとデータベースに応じて setSecret および testSecret ステップを実装するには、Lambda 関数を変更する必要があります。詳細については、「ローテーション関数における 4 ステップ」を参照してください。
シークレットでローテーションを有効にする
--rotation-rules および AutomaticallyAfterDays パラメーターを使用してローテーション間の日数を指定します。
aws secretsmanager rotate-secret --secret-id production/MyAwesomeAppSecret --rotation-lambda-arn arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction --rotation-rules AutomaticallyAfterDays=7
詳細については、「AWS Secrets Manager のシークレットをローテーションする」を参照してください。
関連情報
AWS Secrets Manager のローテーション関数テンプレート
仮想プライベートクラウド内の AWS Secrets Manager サービスに接続する方法
AWS Secrets Manager のシークレットを使用する AWS サービス