Skip to content

Commit 7c21eff

Browse files
authored
Merge pull request #32 from aws-samples/pr-28
This PR contains improvements in Solana blueprint based on the feedback from #28
2 parents d14cd27 + 295d86b commit 7c21eff

16 files changed

+755
-60
lines changed

lib/solana/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,16 @@ Create your own copy of `.env` file and edit it to update with your AWS Account
145145
- Navigate to [CloudWatch service](https://console.aws.amazon.com/cloudwatch/) (make sure you are in the region you have specified for `AWS_REGION`)
146146
- Open `Dashboards` and select `solana-single-node` from the list of dashboards.
147147

148+
7. Connect with the RPC API exposed by the node:
149+
150+
```bash
151+
INSTANCE_ID=$(cat single-node-deploy.json | jq -r '..|.node-instance-id? | select(. != null)')
152+
NODE_INTERNAL_IP=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)
153+
# We query token balance this account: https://solanabeach.io/address/9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
154+
curl http://$NODE_INTERNAL_IP:8899 -X POST -H "Content-Type: application/json" \
155+
--data '{ "jsonrpc": "2.0", "id": 1, "method": "getBalance", "params": ["9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM"]}'
156+
```
157+
148158
### Deploy the HA Nodes
149159

150160
1. Configure and deploy multiple HA Nodes

lib/solana/lib/assets/solana/node-consensus-template.sh

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@ set -o nounset
44
set -o pipefail
55
# Remove empty snapshots
66
find "/var/solana/data/ledger" -name "snapshot-*" -size 0 -print -exec rm {} \; || true
7-
export RUST_LOG=warning
7+
export RUST_LOG=error
88
export RUST_BACKTRACE=full
99
export SOLANA_METRICS_CONFIG=__SOLANA_METRICS_CONFIG__
10+
11+
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
12+
export EC2_INTERNAL_IP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/local-ipv4)
13+
1014
/home/solana/bin/solana-validator \
1115
--ledger /var/solana/data/ledger \
1216
--identity /home/solana/config/validator-keypair.json \
@@ -15,12 +19,10 @@ __KNOWN_VALIDATORS__ \
1519
--expected-genesis-hash __EXPECTED_GENESIS_HASH__ \
1620
__ENTRY_POINTS__ \
1721
--rpc-port 8899 \
18-
--no-port-check \
22+
--private-rpc \
23+
--rpc-bind-address $EC2_INTERNAL_IP \
1924
--wal-recovery-mode skip_any_corrupted_record \
2025
--init-complete-file /var/solana/data/init-completed \
21-
--limit-ledger-size 50000000 \
26+
--limit-ledger-size \
2227
--accounts /var/solana/accounts \
23-
--no-os-cpu-stats-reporting \
24-
--no-os-memory-stats-reporting \
25-
--no-os-network-stats-reporting \
2628
--log -

lib/solana/lib/assets/solana/node-heavy-rpc-template.sh

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,34 @@ set -o nounset
44
set -o pipefail
55
# Remove empty snapshots
66
find "/var/solana/data/ledger" -name "snapshot-*" -size 0 -print -exec rm {} \; || true
7-
export RUST_LOG=warning
7+
export RUST_LOG=error
88
export RUST_BACKTRACE=full
99
export SOLANA_METRICS_CONFIG=__SOLANA_METRICS_CONFIG__
10+
11+
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
12+
export EC2_INTERNAL_IP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/local-ipv4)
13+
1014
/home/solana/bin/solana-validator \
1115
--ledger /var/solana/data/ledger \
1216
--identity /home/solana/config/validator-keypair.json \
1317
__KNOWN_VALIDATORS__ \
1418
--expected-genesis-hash __EXPECTED_GENESIS_HASH__ \
1519
__ENTRY_POINTS__ \
1620
--no-voting \
17-
--snapshot-interval-slots 500 \
18-
--maximum-local-snapshot-age 500 \
1921
--full-rpc-api \
2022
--rpc-port 8899 \
21-
--gossip-port 8801 \
22-
--dynamic-port-range 8800-8813 \
23-
--no-port-check \
23+
--gossip-port 8800 \
24+
--dynamic-port-range 8800-8814 \
25+
--private-rpc \
26+
--rpc-bind-address $EC2_INTERNAL_IP \
2427
--wal-recovery-mode skip_any_corrupted_record \
2528
--enable-rpc-transaction-history \
2629
--enable-cpi-and-log-storage \
2730
--init-complete-file /var/solana/data/init-completed \
28-
--snapshot-compression none \
2931
--require-tower \
3032
--no-wait-for-vote-to-start-leader \
31-
--limit-ledger-size 50000000 \
33+
--limit-ledger-size \
3234
--accounts /var/solana/accounts \
33-
--no-os-cpu-stats-reporting \
34-
--no-os-memory-stats-reporting \
35-
--no-os-network-stats-reporting \
3635
--account-index spl-token-owner \
3736
--account-index program-id \
3837
--account-index spl-token-mint \

lib/solana/lib/assets/solana/node-light-rpc-template.sh

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,37 @@ set -o nounset
44
set -o pipefail
55
# Remove empty snapshots
66
find "/var/solana/data/ledger" -name "snapshot-*" -size 0 -print -exec rm {} \; || true
7-
export RUST_LOG=warning
7+
export RUST_LOG=error
88
export RUST_BACKTRACE=full
99
export SOLANA_METRICS_CONFIG=__SOLANA_METRICS_CONFIG__
10+
11+
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
12+
export EC2_INTERNAL_IP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/local-ipv4)
13+
14+
# TODO: Delete below
15+
# --gossip-port 8800 \
16+
# --dynamic-port-range 8801-8814 \ SG ports 8802-8814
17+
# --no-port-check \
18+
1019
/home/solana/bin/solana-validator \
1120
--ledger /var/solana/data/ledger \
1221
--identity /home/solana/config/validator-keypair.json \
1322
__KNOWN_VALIDATORS__ \
1423
--expected-genesis-hash __EXPECTED_GENESIS_HASH__ \
1524
__ENTRY_POINTS__ \
1625
--no-voting \
17-
--snapshot-interval-slots 500 \
18-
--maximum-local-snapshot-age 500 \
1926
--full-rpc-api \
2027
--rpc-port 8899 \
21-
--gossip-port 8801 \
22-
--dynamic-port-range 8800-8813 \
23-
--no-port-check \
28+
--gossip-port 8800 \
29+
--dynamic-port-range 8800-8814 \
30+
--private-rpc \
31+
--rpc-bind-address $EC2_INTERNAL_IP \
2432
--wal-recovery-mode skip_any_corrupted_record \
2533
--enable-rpc-transaction-history \
2634
--enable-cpi-and-log-storage \
2735
--init-complete-file /var/solana/data/init-completed \
28-
--snapshot-compression none \
2936
--require-tower \
3037
--no-wait-for-vote-to-start-leader \
31-
--limit-ledger-size 50000000 \
38+
--limit-ledger-size \
3239
--accounts /var/solana/accounts \
33-
--no-os-cpu-stats-reporting \
34-
--no-os-memory-stats-reporting \
35-
--no-os-network-stats-reporting \
3640
--log -

lib/solana/lib/assets/sync-checker/syncchecker-solana.sh

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
#!/bin/bash
22

33
INIT_COMPLETED_FILE=/var/solana/data/init-completed
4-
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
5-
REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r)
4+
5+
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
6+
INSTANCE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/instance-id)
7+
REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r)
8+
EC2_INTERNAL_IP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/local-ipv4)
69
TIMESTAMP=$(date +"%Y-%m-%dT%H:%M:%S%:z")
710

811
if [ -f "$INIT_COMPLETED_FILE" ]; then
9-
SOLANA_BLOCK_HEIGHT=$(curl -s -X POST -H "Content-Type: application/json" -d ' {"jsonrpc":"2.0","id":1,"method":"getBlockHeight"}' http://localhost:8899 | jq .result)
10-
SOLANA_SLOTS_BEHIND_DATA=$(curl -s -X POST -H "Content-Type: application/json" -d ' {"jsonrpc":"2.0","id":1, "method":"getHealth"}' http://localhost:8899 | jq .error.data)
12+
SOLANA_BLOCK_HEIGHT=$(curl -s -X POST -H "Content-Type: application/json" -d ' {"jsonrpc":"2.0","id":1,"method":"getBlockHeight"}' http://$EC2_INTERNAL_IP:8899 | jq .result)
13+
SOLANA_SLOTS_BEHIND_DATA=$(curl -s -X POST -H "Content-Type: application/json" -d ' {"jsonrpc":"2.0","id":1, "method":"getHealth"}' http://$EC2_INTERNAL_IP:8899 | jq .error.data)
1114
SOLANA_SLOTS_BEHIND=$(echo $SOLANA_SLOTS_BEHIND_DATA | jq .numSlotsBehind -r)
1215

1316
if [ $SOLANA_SLOTS_BEHIND == "null" ]

lib/solana/lib/assets/user-data/node.sh

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ sudo usermod -aG sudo solana
213213
cd /home/solana
214214
sudo mkdir ./bin
215215

216-
echo "Download and unpack Solana"
217216
echo "Downloading x86 binaries for version v$SOLANA_VERSION"
218217

219218
sudo wget -q https://github.com/solana-labs/solana/releases/download/v$SOLANA_VERSION/solana-release-x86_64-unknown-linux-gnu.tar.bz2
@@ -227,38 +226,39 @@ cd /home/solana/bin
227226
if [[ $NODE_IDENTITY_SECRET_ARN == "none" ]]; then
228227
echo "Create node identity"
229228
sudo ./solana-keygen new --no-passphrase -o /home/solana/config/validator-keypair.json
230-
NODE_IDENTITY=$(sudo ./solana-keygen pubkey /home/solana/config/validator-keypair.json)
231-
echo "Backing up node identity to AWS Secrets Manager"
232-
sudo aws secretsmanager create-secret --name "solana-node/"$NODE_IDENTITY --description "Solana Node Identity Secret created for stack $CF_STACK_NAME" --secret-string file:///home/solana/config/validator-keypair.json --region $AWS_REGION
233229
else
234-
echo "Retrieving node identity from AWS Secrets Manager"
230+
echo "Get node identity from AWS Secrets Manager"
235231
sudo aws secretsmanager get-secret-value --secret-id $NODE_IDENTITY_SECRET_ARN --query SecretString --output text --region $AWS_REGION > ~/validator-keypair.json
236232
sudo mv ~/validator-keypair.json /home/solana/config/validator-keypair.json
237233
fi
238-
239234
if [[ "$SOLANA_NODE_TYPE" == "consensus" ]]; then
235+
if [[ $NODE_IDENTITY_SECRET_ARN == "none" ]]; then
236+
echo "Storing generated node identity to AWS Secrets Manager"
237+
NODE_IDENTITY=$(sudo ./solana-keygen pubkey /home/solana/config/vote-account-keypair.json)
238+
sudo aws secretsmanager create-secret --name "solana-node/"$NODE_IDENTITY --description "Solana Node Identity Secret created for stack $CF_STACK_NAME" --secret-string file:///home/solana/config/validator-keypair.json --region $AWS_REGION
239+
fi
240240
if [[ $VOTE_ACCOUNT_SECRET_ARN == "none" ]]; then
241241
echo "Create Vote Account Secret"
242242
sudo ./solana-keygen new --no-passphrase -o /home/solana/config/vote-account-keypair.json
243243
NODE_IDENTITY=$(sudo ./solana-keygen pubkey /home/solana/config/vote-account-keypair.json)
244-
echo "Backing up Vote Account Secret to AWS Secrets Manager"
244+
echo "Storing Vote Account Secret to AWS Secrets Manager"
245245
sudo aws secretsmanager create-secret --name "solana-node/"$NODE_IDENTITY --description "Solana Vote Account Secret created for stack $CF_STACK_NAME" --secret-string file:///home/solana/config/vote-account-keypair.json --region $AWS_REGION
246246

247247
if [[ $AUTHORIZED_WITHDRAWER_ACCOUNT_SECRET_ARN == "none" ]]; then
248248
echo "Create Authorized Withdrawer Account Secret"
249249
sudo ./solana-keygen new --no-passphrase -o /home/solana/config/authorized-withdrawer-keypair.json
250250
NODE_IDENTITY=$(sudo ./solana-keygen pubkey /home/solana/config/authorized-withdrawer-keypair.json)
251-
echo "Backing up Authorized Withdrawer Account to AWS Secrets Manager"
251+
echo "Storing Authorized Withdrawer Account to AWS Secrets Manager"
252252
sudo aws secretsmanager create-secret --name "solana-node/"$NODE_IDENTITY --description "Authorized Withdrawer Account Secret created for stack $CF_STACK_NAME" --secret-string file:///home/solana/config/authorized-withdrawer-keypair.json --region $AWS_REGION
253253

254254
else
255-
echo "Retrieving Authorized Withdrawer Account Secret from AWS Secrets Manager"
255+
echo "Get Authorized Withdrawer Account Secret from AWS Secrets Manager"
256256
sudo aws secretsmanager get-secret-value --secret-id $AUTHORIZED_WITHDRAWER_ACCOUNT_SECRET_ARN --query SecretString --output text --region $AWS_REGION > ~/authorized-withdrawer-keypair.json
257257
sudo mv ~/authorized-withdrawer-keypair.json /home/solana/config/authorized-withdrawer-keypair.json
258258
fi
259259

260260
if [[ $REGISTRATION_TRANSACTION_FUNDING_ACCOUNT_SECRET_ARN != "none" ]]; then
261-
echo "Retrieving Registration Transaction Funding Account Secret from AWS Secrets Manager"
261+
echo "Get Registration Transaction Funding Account Secret from AWS Secrets Manager"
262262
sudo aws secretsmanager get-secret-value --secret-id $REGISTRATION_TRANSACTION_FUNDING_ACCOUNT_SECRET_ARN --query SecretString --output text --region $AWS_REGION > ~/id.json
263263
sudo mkdir -p /root/.config/solana
264264
sudo mv ~/id.json /root/.config/solana/id.json
@@ -274,7 +274,7 @@ if [[ "$SOLANA_NODE_TYPE" == "consensus" ]]; then
274274
echo "Deleting Authorized Withdrawer Account from the local disc"
275275
sudo rm /home/solana/config/authorized-withdrawer-keypair.json
276276
else
277-
echo "Retrieving Vote Account Secret from AWS Secrets Manager"
277+
echo "Get Vote Account Secret from AWS Secrets Manager"
278278
sudo aws secretsmanager get-secret-value --secret-id $VOTE_ACCOUNT_SECRET_ARN --query SecretString --output text --region $AWS_REGION > ~/vote-account-keypair.json
279279
sudo mv ~/vote-account-keypair.json /home/solana/config/vote-account-keypair.json
280280
fi
@@ -296,7 +296,6 @@ sed -i "s/__KNOWN_VALIDATORS__/$KNOWN_VALIDATORS/g" /home/solana/bin/validator.s
296296
sed -i "s/__ENTRY_POINTS__/$ENTRY_POINTS/g" /home/solana/bin/validator.sh
297297
sudo chmod +x /home/solana/bin/validator.sh
298298

299-
echo "Making sure the solana user has access to everything needed"
300299
sudo chown -R solana:solana /var/solana
301300
sudo chown -R solana:solana /home/solana
302301

lib/solana/lib/constructs/solana-node-security-group.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ export interface SolanaNodeSecurityGroupConstructProps {
2424
});
2525

2626
// Public ports
27-
sg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcpRange(8801, 8812), "P2P protocols (gossip, turbine, repair, etc)");
28-
sg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.udpRange(8801, 8812), "P2P protocols (gossip, turbine, repair, etc)");
27+
sg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcpRange(8800, 8814), "P2P protocols (gossip, turbine, repair, etc)");
28+
sg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.udpRange(8800, 8814), "P2P protocols (gossip, turbine, repair, etc)");
2929

3030
// Private ports restricted only to the VPC IP range
3131
sg.addIngressRule(ec2.Peer.ipv4(vpc.vpcCidrBlock), ec2.Port.tcp(8899), "RPC port HTTP (user access needs to be restricted. Allowed access only from internal IPs)");

0 commit comments

Comments
 (0)