シークレット値へのアクセス
Amplify CLIを使用すると、Lambda関数から安全にアクセスできるシークレット値を設定できます。各Amplifyの環境には異なるシークレット値を設定できます。これにより、開発環境と本番環境で異なるAPIキーを使用するなどのユースケースが可能になります。シークレットは、データベースパスワード、APIキー、アクセストークンなどの値に使用する必要があります。
Lambda関数で機密性の低い設定値にアクセスする場合は、環境変数を使用します。
シークレット値の設定
シークレット値を使用した新しい関数を設定するには、amplify add functionを実行し、詳細設定プロンプトでyesを選択し、シークレット設定プロンプトでyesを選択します。そこからシークレットの名前と値を指定できます。
$ amplify add function...? Do you want to configure advanced settings? Yes...? Do you want to configure secret values this function can access? Yes? Enter a secret name (this is the key used to look up the secret value): API_KEY? Enter the value for API_KEY: [hidden]? What do you want to do? (Use arrow keys) Add a secret Update a secret Remove secrets> I'm done既存の関数のシークレットを設定するには、amplify update functionを実行し、Secret values configurationを選択します。その後、シークレット値を追加、更新、削除できます。
$ amplify update function...? Which setting do you want to update? Resource access permissions Scheduled recurring invocation Lambda layers configuration Environment variables configuration> Secret values configuration? What do you want to do?> Add a secret Update a secret Remove secrets I'm done注:Amplify CLIはシークレットをローカルに保存することはありません。すべてのシークレット値は、SecureStringパラメータタイプを使用してAWS Parameter Storeに即座に保存されます。
関数内での値へのアクセス
Lambda関数内でシークレット値にアクセスするには、AWS SSM GetParameter APIを使用します。Amplify CLIは自動的にシークレットのSSMパラメータ名を環境変数として関数に提供します。この値はAPI呼び出しの「Name」として値を取得するために渡すことができます。API呼び出しで「WithDecryption」がtrueに指定されていることを確認してください。
Lambda関数がNode.jsランタイムを使用している場合、シークレット値を取得するためのサンプルコードを含むコメントブロックがindex.jsファイルの最上部に配置されます。
const aws = require('aws-sdk');
const { Parameters } = await (new aws.SSM()) .getParameters({ Names: ["EXAMPLE_SECRET_1", "EXAMPLE_SECRET_2"].map(secretName => process.env[secretName]), WithDecryption: true, }) .promise();
// Parameters will be of the form { Name: 'secretName', Value: 'secretValue', ... }[]const { SSMClient, GetParametersCommand } = require("@aws-sdk/client-ssm");
const client = new SSMClient();
const command = new GetParametersCommand({ Names: ["EXAMPLE_SECRET_1", "EXAMPLE_SECRET_2"].map( (secretName) => process.env[secretName] ), WithDecryption: true,});
client .send(command) .then((response) => { const { Parameters } = response; console.log(Parameters); }) .catch((error) => { console.error(error); });マルチ環境ワークフロー
amplify env addを使用して新しいAmplify環境を作成するときに、Amplify CLIは、すべてのシークレット値を新しい環境に適用するか、それらを変更するかを尋ねます。既存の値を適用することを選択した場合でも、いつでもamplify update functionを使用して編集できます。
amplify env add --envName <new env name> --yesを使用して新しいAmplify環境を作成するときに、Amplify CLIは現在の環境からすべてのシークレット値を新しい環境に適用します。
マルチ環境ワークフローでは、1つのAmplify環境で新しいシークレットを追加し、別のAmplify環境にチェックアウトした場合があります。この場合、次のamplify pushでは、Amplify CLIは現在の環境で値が指定されていない新しいシークレットを検出し、値を入力するよう促します。この場合にamplify push --yesを実行すると、不足しているシークレット値を説明するメッセージとともに失敗します。
gitベースのマルチ環境ワークフローでは、デプロイ中にエラーが発生する場合があります。たとえば、envA(gitブランチbranchAに対応)でシークレットを追加してから、amplify env checkout envBとgit checkout branchBを実行し、branchAをbranchBにマージした場合、envBをプッシュすると、Amplify CLIは新しいシークレットが追加されたことを検出しますが、その値を推測できません。この問題を解決するには、ターミナルで次のコマンドを実行します:
amplify env checkout <failing env name>amplify push- プロンプトが表示されたら、シークレットの新しい値を入力しますgit commitgit push