Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

【AWS Lambda】アクセスキーとシークレットアクセスキーを環境変数から参照する

AWS Lambdaで、アクセスキーとシークレットアクセスキーを環境変数から参照する方法です。

検証環境

Java 8

AWS Lambdaで実行する場合

AWS Lambdaにおいて、アクセスキーとシークレットアクセスキーの環境変数のキーは予約されています。 docs.aws.amazon.com

  1. AWS Toolkitの設定画面で、アクセスキーとシークレットアクセスキーを設定しておきます。 f:id:JHashimoto:20180619105007p:plain
  2. 書いたコードをAWS Lambdaにアップロードすると、環境変数に値が設定されます。

検証コード

package net.jhashimoto.aws.lambda;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<String, Integer> {

    @Override
    public Integer handleRequest(String input, Context context) {
        // 環境変数から認証情報を取得
        AWSCredentials credentials = new EnvironmentVariableCredentialsProvider().getCredentials();

        return 0;
    }
}

JUnitで実行する場合

JUnitの場合は、System Rulesで環境変数を設定します。環境変数の値は、テストメソッドの実行が終了すると消去されます。

stefanbirkner.github.io

検証コード

package net.jhashimoto.aws.lambda;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.EnvironmentVariables;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;

public class CredentialsTest {
    @Rule
    public final EnvironmentVariables environmentVariables = new EnvironmentVariables();

    @Test
    public void testCredentials() {
        environmentVariables.set("AWS_ACCESS_KEY_ID", "XXXXXXXXXXXXXXXXXXXX");
        environmentVariables.set("AWS_SECRET_ACCESS_KEY", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

        // 環境変数から認証情報を取得
        AWSCredentials credentials = new EnvironmentVariableCredentialsProvider().getCredentials();

        Assert.assertEquals("XXXXXXXXXXXXXXXXXXXX", credentials.getAWSAccessKeyId());
        Assert.assertEquals("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", credentials.getAWSSecretKey());
    }
}